ap-02-pointer.pdf
TRANSCRIPT
-
8/9/2019 AP-02-Pointer.pdf
1/27
ConCon trỏtrỏGV.GV. NguyễnNguyễn MinhMinh HuyHuy
1Kỹ thuật lập trình - Nguyễn Minh Huy
-
8/9/2019 AP-02-Pointer.pdf
2/27
NộiNội dungdung
KháiKhái niệmniệm concon trỏtrỏ..
SửSử dụngdụng concon trỏtrỏ..
MảngMảng vàvà concon trỏtrỏ..
2Kỹ thuật lập trình - Nguyễn Minh Huy
-
8/9/2019 AP-02-Pointer.pdf
3/27
NộiNội dungdung
KháiKhái niệmniệm concon trỏtrỏ..
SửSử dụngdụng concon trỏtrỏ..
MảngMảng vàvà concon trỏtrỏ..
3Kỹ thuật lập trình - Nguyễn Minh Huy
-
8/9/2019 AP-02-Pointer.pdf
4/27
KháiKhái niệmniệm concon trỏtrỏ
BộBộ nhớnhớ máymáy tínhtính:: RAM (RAM (RRandomandom AAccessccess MMemory).emory).
RAMRAM dùngdùng đểđể chứachứa:: HệHệ điềuđiều hànhhành..
LệnhLệnh ++ dữdữ liệuliệu chươngchương trìnhtrình..
RAM (4GB)0
BaoBao g mg m cáccác ôô nhớnhớ 1 byte.1 byte. RAM 4GB ~ 4RAM 4GB ~ 4 tỷtỷ ôô nhớnhớ..
MỗiMỗi ôô nhớnhớ cócó địađịa chỉ chỉ đánhđánh sốsố từtừ 0.0.
RAM 1GBRAM 1GB địađịa chỉ chỉ từtừ 00
223030
– – 1.1. RAM 4GBRAM 4GB địađịa chỉ chỉ từtừ 00 223232 – – 1.1.
4Kỹ thuật lập trình - Nguyễn Minh Huy
232
-
8/9/2019 AP-02-Pointer.pdf
5/27
KháiKhái niệmniệm concon trỏtrỏ
ĐịaĐịa chỉ chỉ biếnbiến:: ĐiềuĐiều gìgì xảyxảy rara khikhi khaikhai báobáo biếnbiến??
CấpCấp mộtmột dãydãy ôô nhớnhớ liênliên tiếptiếp.. SốSố ô =ô = kíchkích thướcthước kiểukiểu dữdữ liệuliệu..
GắnGắn têntên biếnbiến vớivới địađịa chỉ chỉ ôô đầuđầu dãydãy..
? ? ? ?
intint xx;;
xx
65 66 67 6865 66 67 68
== ..GiáGiá trịtrị biếnbiến đượcđược lưulưu thếthế nàonào??
ChiaChia giágiá trịtrị biếnbiến thànhthành cáccác byte.byte.
LưuLưu mỗimỗi bytebyte vàovào mộtmột ôô nhớnhớ..
ThứThứ tựtự lưulưu byte:byte: thấpthấp đếnđến caocao..
ThứThứ tựtự lưulưu vàovào ôô nhớnhớ:: đầuđầu đếnđến cuốicuối dãydãy..
5Kỹ thuật lập trình - Nguyễn Minh Huy
xx = 1057;= 1057;
33 4 0 0xx 65 66 67 6865 66 67 68
-
8/9/2019 AP-02-Pointer.pdf
6/27
KháiKhái niệmniệm concon trỏtrỏ
KiểuKiểu địađịa chỉ chỉ trongtrong C:C:MỗiMỗi biếnbiến cócó mộtmột địađịa chỉ chỉ..
ĐịaĐịa chỉ chỉ biếnbiến cócó kiểukiểu: **.. BiếnBiến intint cócó địađịa chỉ chỉ kiểukiểu intint *.*.
ToánToán tửtử &&::
CôngCông dụngdụng:: lấylấy địađịa chỉ chỉ củacủa biếnbiến.. CúCú pháppháp:: &&;
intint x = 1057;x = 1057;float y = 1.25;float y = 1.25;
intint **dia_chi_xdia_chi_x == &&x;x;float *float *dia_chi_ydia_chi_y == &&y;y;
6Kỹ thuật lập trình - Nguyễn Minh Huy
xx = 1057;= 1057;
33 4 0 0xx
65 66 67 6865 66 67 68
65 0 0 0dia_chi_xdia_chi_x91 92 93 9491 92 93 94
-
8/9/2019 AP-02-Pointer.pdf
7/27
KháiKhái niệmniệm concon trỏtrỏ
ConCon trỏtrỏ trongtrong C:C: LàLà biếnbiến cócó kiểukiểu địađịa chỉ chỉ..
NhậnNhận giágiá trịtrị làlà địađịa chỉ chỉ củacủa biếnbiến kháckhác.. KíchKích thướcthước concon trỏtrỏ::
BằngBằng nhaunhau dùdù kháckhác kiểukiểu địađịa chỉ chỉ..
BằngBằng kíchkích thướcthước địađịa chỉ chỉ RAM.RAM. TùyTùy thuộcthuộc vàovào hệhệ máymáy tínhtính..
VíVí dụdụ::-- HệHệ máymáy 1616--bit, 2 bytes (64KB)bit, 2 bytes (64KB)
-- HệHệ máymáy 3232--bit, 4 bytes (4GB)bit, 4 bytes (4GB)
7Kỹ thuật lập trình - Nguyễn Minh Huy
-
8/9/2019 AP-02-Pointer.pdf
8/27
NộiNội dungdung
KháiKhái niệmniệm concon trỏtrỏ..
SửSử dụngdụng concon trỏtrỏ..
MảngMảng vàvà concon trỏtrỏ..
8Kỹ thuật lập trình - Nguyễn Minh Huy
-
8/9/2019 AP-02-Pointer.pdf
9/27
SửSử dụngdụng concon trỏtrỏ
KhaiKhai báobáo concon trỏtrỏ:: KhaiKhai báobáo biếnbiến cócó kiểukiểu địađịa chỉ chỉ..
CáchCách 1:1: **;
intint **p1;p1; // Con// Con trỏtrỏ kiểukiểu int.int. ** ..
CáchCách 2:2:typedef typedef ** ;
;
typedef typedef intint ** ConTroIntConTroInt;;typedef typedef floatfloat ** ConTroFloatConTroFloat;;ConTroIntConTroInt p1;p1;ConTroFloatConTroFloat p2;p2;
9Kỹ thuật lập trình - Nguyễn Minh Huy
-
8/9/2019 AP-02-Pointer.pdf
10/27
SửSử dụngdụng concon trỏtrỏ
KhởiKhởi tạotạo concon trỏtrỏ:: ConCon trỏtrỏ vừavừa khaikhai báobáo chưachưa nhậnnhận địađịa chỉ chỉ nàonào..
TToánoán tửtử &&:: khởikhởi tạotạo địađịa chỉ chỉ chocho concon trỏtrỏ.. = &&;
intint x;x;**
ConCon trỏtrỏ kiểukiểu gìgì thìthì chỉ chỉ nhậnnhận địađịa chỉ chỉ củacủa biếnbiến kiểukiểu đóđó!!!!float y;float y;intint **q =q = &&y;y; //// SaiSai..
ĐịaĐịa chỉ chỉ NULL:NULL: ĐịaĐịa chỉ chỉ rỗngrỗng,, khôngkhông thuộcthuộc ôô nhớnhớ nàonào..
DùngDùng đểđể khởikhởi tạotạo địađịa chỉ chỉ mặcmặc địnhđịnh chocho concon trỏtrỏ..
intint **r =r = NULLNULL;; // r// r nhậnnhận địađịa chỉ chỉ rỗngrỗng..
10Kỹ thuật lập trình - Nguyễn Minh Huy
-
8/9/2019 AP-02-Pointer.pdf
11/27
SửSử dụngdụng concon trỏtrỏ
TruyTruy xuấtxuất nộinội dungdung vùngvùng nhớnhớ:: ToánToán tửtử **::
CôngCông dụngdụng:: truytruy xuấtxuất nộinội dungdung vùngvùng nhớnhớ concon trỏtrỏ giữgiữ địađịa chỉ chỉ.. CúCú pháppháp: = **;
intint x = 5;x = 5;** ==
intint k =k = *p*p;; //// lấylấy giágiá trịtrị củacủa x.x.printf printf(“%d(“%d\\n”,n”, pp);); //// XuấtXuất địađịa chỉ chỉ x.x.printf printf(“%d(“%d\\n”,n”, *p*p);); //// XuấtXuất giágiá trịtrị x.x.printf printf(“%d(“%d\\n”,n”, &p&p););//// XuấtXuất địađịa chỉ chỉ p.p.
ConCon trỏtrỏ ““trỏtrỏ”” đếnđến vùngvùng nhớnhớ nónó giữgiữ địađịa chỉ chỉ!!!!
11Kỹ thuật lập trình - Nguyễn Minh Huy
5 0 0 0xx72 73 74 7572 73 74 75
72 0 0 0pp91 92 93 9491 92 93 94
-
8/9/2019 AP-02-Pointer.pdf
12/27
SửSử dụngdụng concon trỏtrỏ
TruyềnTruyền thamtham sốsố concon trỏtrỏ:: TruyềnTruyền thamtham trịtrị::
NhậnNhận vàovào: con: con trỏtrỏ,, địađịa chỉ chỉ biếnbiến.. LàmLàm việcviệc trêntrên bảnbản saosao concon trỏtrỏ..
GiáGiá trịtrị concon trỏtrỏ KHÔNGKHÔNG thaythay đổiđổi..
““ ””
voidvoid foofoo((intint **g)g){{
*g = *g + 1;*g = *g + 1;
g = g + 1;g = g + 1;}}
voidvoid mainmain()()
CÓ THỂCÓ THỂ bịbị thaythay đổiđổi..
12Kỹ thuật lập trình - Nguyễn Minh Huy
intint x = 5;x = 5;intint *p = &x;*p = &x;
foofoo((pp););
foofoo((&x&x););//// GiáGiá trịtrị xx đổiđổi..}}
main()
5 0 0 0xx
72 73 74 7572 73 74 75
72 0 0 0pp91 92 93 9491 92 93 94
foo(int *g)
72 0 0 0gg66 67 68 6966 67 68 69
-
8/9/2019 AP-02-Pointer.pdf
13/27
SửSử dụngdụng concon trỏtrỏ
TruyềnTruyền thamtham sốsố concon trỏtrỏ:: TruyềnTruyền thamtham chiếuchiếu::
NhậnNhận vàovào:: chỉ chỉ concon trỏtrỏ.. LàmLàm việcviệc trêntrên bảnbản gốcgốc concon trỏtrỏ..
GiáGiá trịtrị concon trỏtrỏ CÓ THỂCÓ THỂ thaythay đổiđổi..
““ ””
voidvoid foofoo((intint *&*&g)g){{
*g = *g + 1;*g = *g + 1;
g = g + 1g = g + 1}}
voidvoid mainmain()()
CÓ THỂCÓ THỂ bịbị thaythay đổiđổi..
13Kỹ thuật lập trình - Nguyễn Minh Huy
intint x = 5;x = 5;intint *p = &x;*p = &x;
foofoo((pp););
foofoo((&x&x); //); // SaiSai//// GiáGiá trịtrị xx đổiđổi..//// GiáGiá trịtrị pp đổiđổi..
}}
main()
5 0 0 0xx
72 73 74 7572 73 74 75
foo(int *&g)
72 0 0 0pp91 92 93 9491 92 93 94
gg
-
8/9/2019 AP-02-Pointer.pdf
14/27
SửSử dụngdụng concon trỏtrỏ
ConCon trỏtrỏ cấucấu trúctrúc::GiữGiữ địađịa chỉ chỉ biếnbiến cấucấu trúctrúc..
KhaiKhai báobáo:: CáchCách 1: **;
CáchCách 2:2: typedef typedef ** ;
< nn concon r r >;>;
structstruct PhanSoPhanSo{{
intint tutu,, maumau;;
};};typedef typedef PhanSoPhanSo ** ConTroPhanSoConTroPhanSo;;
PhanSoPhanSo **p;p;
ConTroPhanSoConTroPhanSo q;q;
14Kỹ thuật lập trình - Nguyễn Minh Huy
-
8/9/2019 AP-02-Pointer.pdf
15/27
SửSử dụngdụng concon trỏtrỏ
ConCon trỏtrỏ cấucấu trúctrúc:: TruyTruy xuấtxuất thànhthành phầnphần::
CáchCách 1:1: (*(*)).; CáchCách 2: -->>;
PhanSoPhanSo **p;p;
(*(*pp))..tutu = 1;= 1;pp-->>maumau = 2;= 2;
(*(*qq))..tutu = 1;= 1;qq-->>maumau = 3;= 3;
15Kỹ thuật lập trình - Nguyễn Minh Huy
-
8/9/2019 AP-02-Pointer.pdf
16/27
NộiNội dungdung
KháiKhái niệmniệm concon trỏtrỏ..
SửSử dụngdụng concon trỏtrỏ..
MảngMảng vàvà concon trỏtrỏ..
16Kỹ thuật lập trình - Nguyễn Minh Huy
-
8/9/2019 AP-02-Pointer.pdf
17/27
MảngMảng vàvà concon trỏtrỏ
MảngMảng trongtrong C:C: LàLà mộtmột concon trỏtrỏ..
GiữGiữ địađịa chỉ chỉ phầnphần tửtử đầuđầu tiêntiên..voidvoid mainmain()(){{
printf printf(“%d(“%d\\n”,n”, aa););printf printf(“%d(“%d\\n”,n”, &a[0]&a[0]);); // a == &a[0].// a == &a[0].
}}
17Kỹ thuật lập trình - Nguyễn Minh Huy
1 0 0 0aa72 73 74 7572 73 74 75
2 0 0 0 3 0 0 076 77 78 7976 77 78 79 80 81 82 8380 81 82 83
a[0]a[0] a[1]a[1] a[2]a[2]
-
8/9/2019 AP-02-Pointer.pdf
18/27
MảngMảng vàvà concon trỏtrỏ
ConCon trỏtrỏ đếnđến mảngmảng:: TruyTruy xuấtxuất mảngmảng giángián tiếptiếp..
XétXét đoạnđoạn chươngchương trìnhtrình sausau::intint a[100] = { 1, 2, 3 };a[100] = { 1, 2, 3 };intint *p = a*p = a;;* = ** = *
printf printf(“%d(“%d\\n”, *p);n”, *p); CơCơ chếchế hoạthoạt độngđộng::
18Kỹ thuật lập trình - Nguyễn Minh Huy
1 0 0 0aa72 73 74 7572 73 74 75
2 0 0 0 3 0 0 076 77 78 7976 77 78 79 80 81 82 8380 81 82 83
a[0]a[0] a[1]a[1] a[2]a[2]
72 0 0 0pp44 45 46 4744 45 46 47
-
8/9/2019 AP-02-Pointer.pdf
19/27
MảngMảng vàvà concon trỏtrỏ
PhépPhép toántoán tăngtăng,, giảmgiảm concon trỏtrỏ::GiáGiá trịtrị concon trỏtrỏ tăngtăng giảmgiảm theotheo kíchkích thướcthước kiểukiểu dữdữ liệuliệu..
CôngCông thứcthức:: +/-- k = +/-- k *k * sizeof sizeof().
intint a[100] = { 1, 2, 3 };a[100] = { 1, 2, 3 };**
printf printf(“%d(“%d\\n”,n”, p + 1p + 1););printf printf(“%d(“%d\\n”,n”, *(p + 2)*(p + 2) ););
19Kỹ thuật lập trình - Nguyễn Minh Huy
1 0 0 0aa72 73 74 7572 73 74 75
2 0 0 0 3 0 0 076 77 78 7976 77 78 79 80 81 82 8380 81 82 83
a[0]a[0] a[1]a[1] a[2]a[2]
72 0 0 0pp44 45 46 4744 45 46 47 p + 1p + 1 p + 2p + 2
-
8/9/2019 AP-02-Pointer.pdf
20/27
MảngMảng vàvà concon trỏtrỏ
ToánToán tửtử [ ]:[ ]: TruyTruy xuấtxuất nộinội dungdung vùngvùng nhớnhớ concon trỏtrỏ giữgiữ địađịa chỉ chỉ..
CôngCông thứcthức::)
intint a[100] = { 1, 2, 3 };a[100] = { 1, 2, 3 };**
a[2] = 5;a[2] = 5;*(a + 2) = 5;*(a + 2) = 5;*(p + 2) = 5;*(p + 2) = 5;
p[2] = 5;p[2] = 5;
20Kỹ thuật lập trình - Nguyễn Minh Huy
-
8/9/2019 AP-02-Pointer.pdf
21/27
MảngMảng vàvà concon trỏtrỏ
TruyềnTruyền thamtham sốsố mảngmảng:: KhôngKhông phảiphải truyềntruyền tấttất cảcả mảngmảng..
Chỉ Chỉ truyềntruyền địađịa chỉ chỉ phầnphần tửtử đầuđầu tiêntiên.. ThamTham sốsố mảngmảng làlà concon trỏtrỏ ““trỏtrỏ”” đếnđến phầnphần tửtử đầuđầu tiêntiên..
voidvoid xuatMangxuatMang((intint a[ ]a[ ],, intint n) {n) { for (for (intint ii = 0;= 0; ii < n;< n; ii++)++)
printf printf(“%d “,(“%d “, *(a++)*(a++) );); //// TươngTương tựtự a[a[ ii ]]}}voidvoid mainmain() {() {
intint a[100];a[100];xuatMangxuatMang((aa, 100);, 100);for (for (intint ii = 0;= 0; ii < n;< n; ii++)++)
printf printf(“%d “,(“%d “, *(a++)*(a++) );); //// SaiSai..}}
21Kỹ thuật lập trình - Nguyễn Minh Huy
ắắ
-
8/9/2019 AP-02-Pointer.pdf
22/27
TómTóm tắttắt
KháiKhái niệmniệm concon trỏtrỏ:: BiếnBiến cócó kiểukiểu làlà địađịa chỉ chỉ..
SửSử dụngdụng concon trỏtrỏ:: KhaiKhai báobáo: *.
..
ToánToán tửtử *:*: truytruy xuấtxuất nộinội dungdung vùngvùng nhớnhớ..
MảngMảng vàvà concon trỏtrỏ::
MảngMảng trongtrong CC làlà mộtmột hằnghằng concon trỏtrỏ.. ConCon trỏtrỏ cócó thểthể ““trỏtrỏ”” đếnđến vùngvùng nhớnhớ mảngmảng..
ToánToán tửtử [ ]:[ ]: truytruy nộinội dungdung vùngvùng nhớnhớ mảngmảng..
22Kỹ thuật lập trình - Nguyễn Minh Huy
-
8/9/2019 AP-02-Pointer.pdf
23/27
BàiBài tậptập
BàiBài tậptập 2.1:2.1:ChoCho đoạnđoạn chươngchương trìnhtrình sausau::void main()void main()
{{intint *x, y;*x, y;float *z;float *z;
y = 2;y = 2;z = &y;z = &y;*x = *x + y;*x = *x + y;printf printf(“%d”, y);(“%d”, y);
}}
a)a) ĐoạnĐoạn chươngchương trìnhtrình trêntrên cócó lỗilỗi gìgì??
b)b) HãyHãy thửthử sửasửa lạilại chocho đúngđúng..
23Kỹ thuật lập trình - Nguyễn Minh Huy
-
8/9/2019 AP-02-Pointer.pdf
24/27
BàiBài tậptập
BàiBài tậptập 2.2:2.2:ChoCho đoạnđoạn chươngchương trìnhtrình sausau::void main()void main()
{{doubledouble m[100];m[100];doubledouble *p1, *p2;*p1, *p2;
p1 = m;p1 = m;p2 = &m[6];p2 = &m[6];}}
HãyHãy chocho biếtbiết p1p1 cáchcách p2p2 baobao nhiêunhiêu byte?byte?
24Kỹ thuật lập trình - Nguyễn Minh Huy
BàiBài tậtậ
-
8/9/2019 AP-02-Pointer.pdf
25/27
BàiBài tậptập
BàiBài tậptập 2.3:2.3:HãyHãy giảigiải thíchthích sựsự kháckhác nhaunhau giữagiữa 33 hàmhàm sausau::void swap1(void swap1(intint x,x, intint y)y)
{{intint temp = x;temp = x;x = y;x = y; = tem= tem
void swap3(void swap3(intint *x,*x, intint *y)*y)
{{intint temp = *x;temp = *x;*x = *y;*x = *y;* = tem* = tem
}}
void swap2(void swap2(intint &x,&x, intint &y)&y){{
intint temp = x;temp = x;
x = y;x = y;y = temp;y = temp;
}}
25Kỹ thuật lập trình - Nguyễn Minh Huy
}}
BàiBài tậtậ
-
8/9/2019 AP-02-Pointer.pdf
26/27
BàiBài tậptập
BàiBài tậptập 2.4:2.4:HãyHãy chocho biếtbiết kếtkết quảquả xuấtxuất rara mànmàn hìnhhình củacủa đoạnđoạn chươngchương trìnhtrình sausau::#include
void main()void main(){{
intint x = 1023x = 1023
char *p = (char *)&x;char *p = (char *)&x;
printf printf(“%d %d %d %d(“%d %d %d %d\\n”, p[0], p[1], p[2], p[3]);n”, p[0], p[1], p[2], p[3]);}}
26Kỹ thuật lập trình - Nguyễn Minh Huy
BàiBài tậtậ
-
8/9/2019 AP-02-Pointer.pdf
27/27
BàiBài tậptập
BàiBài tậptập 2.5:2.5:ViếtViết chươngchương trìnhtrình sửsử dụngdụng concon trỏtrỏ đểđể thựcthực hiệnhiện::
a)a) NhậpNhập mảngmảng NN phânphân sốsố từtừ bànbàn phímphím..
b)b) XuấtXuất rara mànmàn hìnhhình mảngmảng phânphân sốsố theotheo thứthứ tựtự giảmgiảm dầndần..
27Kỹ thuật lập trình - Nguyễn Minh Huy