1/26/2011
1
Chương8
CONTRỎ‐ POINTER
hiepnd@soict.hut.edu.vn
Nidung
Nhclivềtổchcbộnhớcamáytính
Biếncontr
Contrỏcutrúc
Contrỏhàm
Contrỏcutrúc
Contrỏcpphátbộnhớđộng
Nhclitổchcbộnhớcaytính
Nhclivềtổchcbộnhớytính
Trongmáytính,bộnhớtrong:
chiathànhcácônh
Cácônhớđượcđánhđịachỉkhácnhau
Kíchthướccamiônhớ1byte
10010101
11010101
10010100
10000101
11111111
11111110
11111101
00010101
00000000
Địachônh
1/26/2011
2
Nhclivềtổchcbộnhớytính
Khikhaibáo1biến,cácônhớsẽđượccpphátchobiến
đó
intA;//4byte
A=5;
BiếnAđượclưutrữtrong4ô
btđầutiđịachỉ10001111
GiátrịcabiếnA5(4ônhớ
chagiátrị5)
Lyđịachỉônhớ(đầutiên)
cpphátchobiến:dùng
toántử&
&Atrảvề10001111
10001111
10001110
10001101
10001011
10001010
10001001
10001100
10001000
5
BiếnA
#include <stdio.h>
#include <stdlib.h> //chohamsystem()
int main()
{
int a,b;
double c,d;
a=5;b=7;
c=3.5;d=10.0;
printf("Giatria=%d,diachi%#x\n",a,&a);
printf("Giatrib=%d,diachi%#x\n",b,&b);
printf("Giatria=%f,diachi%#x\n",c,&c);
printf("Giatria=%f,diachi%#x\n",d,&d);
system("pause");
return 0;
}
Biếncontr
Biếncontr
Biếncontrỏ‐ PointerVariable:giátrịcabiếnmtđịa
chỉônh.
Kíchthước1biếncontrỏphụthucvàocácplatform
(môitrườngứngdng):
Platform16bit2byte.
Platform32bit4byte.
Platform64bit8byte.
Khaibáobiếncontrỏ
KieuDuLieu*TenBien;
int *pInt;
float *pFloat;
1/26/2011
3
Biếncontr
Kíchthướcbiếncontrỏkhôngphụthucvàokiudữliu
Truycpvàogiátrịcavùngnhớđangtrỏbicontr:dùngtoán
tử*
*pIntgiátrịvùngnhớtrỏbicontrỏpInt
int A=5;
int *pInt;
pInt=&A;
printf("DiachiA=%#x,GiatripInt=%#xDiachipInt=%#x\n",
&A,pInt,&pInt);
printf("GiatriA=%d,giatrivungnhotroboipInt=%d\n",A,*pInt);
*pInt=7;
printf("Gan*pInt=7\n");
printf("GiatriA=%d,giatrivungnhotroboipInt=%d\n",A,*pInt);
0x23FF74
0x23FF73
0x23FF72
0x23FF71
0x23FF70
0x23FF6F
0x23FF6E
0x23FF6D
0x23FF6C
0x23FF6B
0x23FF6A
0x23FF69
0x23FF68
0x23FF67
0x23FF66
0x23FF65
int A;
int *pInt;
A=5;
pInt=&A;
*pInt=7;
5
0x23FF74
7
int *p2;
p2=pInt;
*p2=100;
0x23FF74
100
Biếncontr
#include <stdio.h>
int main(void)
{
char c='Q';
char *char_pointer=&c;
printf("%c%c\n",c,*char_pointer);
c='/';
printf("%c%c\n",c,*char_pointer);
*char_pointer='(';
printf("%c%c\n",c,*char_pointer);
return 0;
}
'Q'
c
char_pointer
'/''(' Biếncontrỏtrongbiuthc
#include <stdio.h>
int main(void)
{
int i1,i2;
int *p1,*p2;
i1=5;
p1=&i1;
i2=*p1/2+10;
p2=p1;
printf("i1=%i,i2=%i,*p1=%i,*p2=%i\n",
i1,i2,*p1,*p2);
return 0;
}
1/26/2011
4
Contrỏhnghngcontr
char c='X';
char *charPtr=&c;
char *const charPtr=&c;
charPtr=&d;//notvalid
const char *charPtr=&c;
*charPtr='Y';//notvalid
const char *const *charPtr=&c;
Khaibáobiếncontrỏthôngthường
charPtrhngcontr,khôngthểthayđổiđược
giátrị(khôngthểtrỏvàoônhớkhác)
thểthayđổigiátrịcaônhớcontrỏđangtrỏđến
charPtrcontrỏhng(contrỏti1hngs)
khôngthểthayđổigiátrịônhớtrỏtibicontr
(cóthểchocontrỏtrỏsangônhớkhác)
Hngcontrỏtrỏtihngs:khôngthayđổiđược
cảgiátrịcontrỏgiátrịônhớtrỏđến
Contrỏcutrúc
Contrỏcutrúc
struct date
{
int month;
int day;
int year;
};
struct datetodaysDate={11,27,2010};
struct date*datePtr;
datePtr=&todaysDate;
11
todaysDate
datePtr
27
2010
.month
.date
.year
Contrỏcutrúc
Truycpvàotrườngbiếncutrúcthôngquacontr
(*nConTr).TênTrường
nConTrỏ‐>TênTrường
datePtr=&todaysDate;
11
todaysDate
datePtr
27
2010
.month
.date
.year
datePtr>month=1;
(*datePtr).day=1;
datePtr>year=2011;
1
1
2011
1/26/2011
5
#include <stdio.h>
int main(void)
{
struct date
{
int month;
int day;
int year;
};
struct datetoday={11,27,2010},*datePtr;
datePtr=&today;
printf("Today'sdateis%i/%i/%.2i.\n",datePtr>month,
datePtr>day,datePtr>year%100);
datePtr>month=1;
(*datePtr).day=1;
datePtr>year=2011;
printf("Today'sdateis%i/%i/%.2i.\n",datePtr>month,
datePtr>day,datePtr>year%100);
return 0;
}
Contrỏcutrúc
Cutrúcchacontr
struct intPtrs
{
int *p1;
int *p2;
};
#include <stdio.h>
int main(void)
{
struct intPtrs
{
int *p1;
int *p2;
};
struct intPtrspointers;
int i1=100,i2;
pointers.p1=&i1;
pointers.p2=&i2;
*pointers.p2=‐97;
printf("i1=%i,*pointers.p1=%i\n",i1,*pointers.p1);
printf("i2=%i,*pointers.p2=%i\n",i2,*pointers.p2);
return 0;
}
97
100
i1
i2
p1
p2
pointers
Contrỏcutrúc
Danhsáchliênkết linkedlist:mttrongnhngcutrúc
phctpđưcxâydngtừquanhệcontrỏcutrúc
struct node
{
int value;
struct node*pNext;
};
5
7
100
value
pNext
value
pNext
value
pNext
N1
N2
N3
#include <stdio.h>
int main(void)
{
struct node
{
int value;
struct entry*pNext;
};
struct nodeN1,N2,N3;
int i;
N1.value=5;N2.value=7;N3.value=‐100;
N1.pNext=&n2;
N2.pNext=&n3;
i=N1.pNext>value;
printf("%i",i);
printf("%i\n",N2.pNext>value);
return 0;
}