
1/26/2011
1
Chương8
CONTRỎ‐ POINTER
hiepnd@soict.hut.edu.vn
Nộidung
Nhắclạivềtổchứcbộnhớcủamáytính
Biếncontrỏ
Contrỏvàcấutrúc
Contrỏvàhàm
Contrỏvàcấutrúc
Contrỏvàcấpphátbộnhớđộng
Nhắclạitổchứcbộnhớcủamáytính
Nhắclạivềtổchứcbộnhớmáytính
Trongmáytính,bộnhớtrong:
chiathànhcácônhớ
Cácônhớđượcđánhđịachỉkhácnhau
Kíchthướccủamỗiônhớlà1byte
10010101
11010101
10010100
10000101
11111111
11111110
11111101
00010101
00000000
Địachỉônhớ

1/26/2011
2
Nhắclạivềtổchứcbộnhớmáytính
Khikhaibáo1biến,cácônhớsẽđượccấpphátchobiến
đó
intA;//4byte
A=5;
BiếnAđượclưutrữtrong4ô
bắtđầutạiđịachỉ10001111
GiátrịcủabiếnAlà5(4ônhớ
chứagiátrị5)
Lấyđịachỉônhớ(đầutiên)
cấpphá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ịcủabiếnlàmộtđịa
chỉônhớ.
Kíchthước1biếncontrỏphụthuộcvàocácplatform
(môitrườngứngdụng):
Platform16bitlà2byte.
Platform32bitlà4byte.
Platform64bitlà8byte.
Khaibáobiếncontrỏ
KieuDuLieu*TenBien;
int *pInt;
float *pFloat;

1/26/2011
3
Biếncontrỏ
Kíchthướcbiếncontrỏkhôngphụthuộcvàokiểudữliệu
Truycậpvàogiátrịcủavùngnhớđangtrỏbởicontrỏ:dùngtoán
tử*
*pIntlàgiátrịvùngnhớtrỏbởicontrỏ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ỏtrongbiểuthức
#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ỏhằngvàhằngcontrỏ
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
charPtrlàhằngcontrỏ,nókhôngthểthayđổiđược
giátrị(khôngthểtrỏvàoônhớkhác)
Cóthểthayđổigiátrịcủaônhớcontrỏđangtrỏđến
charPtrlàcontrỏhằng(contrỏtới1hằngsố)
khôngthểthayđổigiátrịônhớtrỏtớibởicontrỏ
(cóthểchocontrỏtrỏsangônhớkhác)
Hằngcontrỏtrỏtớihằngsố:khôngthayđổiđược
cảgiátrịcontrỏvàgiátrịônhớmànótrỏđến
Contrỏvàcấutrúc
Contrỏvàcấutrú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ỏvàcấutrúc
Truycậpvàotrườngbiếncấutrúcthôngquacontrỏ
(*TênConTrỏ).TênTrường
Tê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ỏvàcấutrúc
Cấutrúcchứacontrỏ
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ỏvàcấutrúc
Danhsáchliênkết– linkedlist:mộttrongnhữngcấutrúc
phứctạpđượcxâydựngtừquanhệcontrỏvàcấutrú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;
}