Bài giảng Lập trình nâng cao - Chương 7: Con trỏ
Số trang: 54
Loại file: pdf
Dung lượng: 629.55 KB
Lượt xem: 13
Lượt tải: 0
Xem trước 6 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Bài giảng "Lập trình nâng cao - Chương 7: Con trỏ" cung cấp cho người học các kiến thức: Cơ chế bộ nhớ, cách sử dụng, cơ chế truyền tham số, lỗi thường gặp, các phép toán, con trỏ và mảng. Mời các bạn cùng tham khảo nội dung chi tiết.
Nội dung trích xuất từ tài liệu:
Bài giảng Lập trình nâng cao - Chương 7: Con trỏ Contrỏ LậptrìnhnângcaoMộtsốnộidunglấytừslicecủaUriDekel,CMU Outline• Cơchếbộnhớ• Cáchsửdụng• Cơchếtruyềnthamsố – Truyềnbằngcontrỏ-Pass-by-pointer• Lỗithườnggặp• Cácphéptoán – Đổikiểu,+,-,++,--• Contrỏvàmảng Cơchếbộnhớ• Contrỏlàmộtbiến – Nócómộtđịachỉvàlưumộtgiátrị – Nhưnggiátrịcủanóđượchiểulàđịachỉbộnhớ.• Xx; //biếnkiểuX• X*p; //biếnkiểucontrỏtớigiátrịkiểuX• Kíchthướccủacontrỏkhôngphụthuộckiểudữliệu nótrỏtới. Gángiátrịchocontrỏ Gángiátrịsố Gánđịachỉcủabiến GángiátrịcontrỏkhácGánđịachỉcủahàm(ngoàichươngtrình) Dereferencing LấygiátrịbiếncontrỏtrỏtớiNếupXlàcontrỏthì(*pX)truynhậpvùngnhớpXtrỏtới.-(*pC1)tươngđươngvớic-ctươngđươngvới(*(&c))Dereferencing-Vídụ Cóthểdùng(*pX)tươngtự nhưdùngbiếnmàpXtrỏtới - Đọcgiátrị - Ghigiátrịmới - Trảvềgiátrị pass-by-pointervoid swap(int* px, int* py) { int c; c = *px; *px = *py; *py = c;}int main() { int a = 20; int b = 25; swap(&a, &b); cout pass-by-pointervoid swap(int* px, int* py) { int c; c = *px; *px = *py; *py = c;}int main() { int a = 20; int b = 25; swap(&a, &b); cout pass-by-pointervoid swap(int* px, int* py) { int c; c = *px; *px = *py; *py = c;}int main() { int a = 20; int b = 25; swap(&a, &b); cout pass-by-pointervoid swap(int* px, int* py) { int c; c = *px; *px = *py; *py = c;}int main() { int a = 20; int b = 25; swap(&a, &b); cout pass-by-pointervoid swap(int* px, int* py) { int c; c = *px; *px = *py; Thamsốlàcontrỏ *py = c;}int main() { int a = 20; Đốisốlàđịachỉ int b = 25; swap(&a, &b); cout Lỗithườnggặp–contrỏchưakhởitạo• Contrỏchưakhởitạocóthểchứadữliệurác –địachỉngẫunhiên• Truynhậpchúngdẫnđếncáclỗighiđèdữ liệu,ghivàovùngcấmghi….segmenta~on faults,v.v..Lỗithườnggặp:truynhậpcontrỏnull• Tươngđươngtruynhậpđịachỉ0trongbộ nhớ Lỗithườnggặp:danglingreferences• danglingreference:truynhậptớivùngnhớkhông cònhợplệ• Vídụ:trảvềcontrỏtớibiếnđịaphương int* weird_sum(int a, int b) { int c; c = a + b; return &c; }• Lờikhuyên:đừnggiữcontrỏtớibiếncóphạmvi nhỏhơnchínhbiếncontrỏđó. Đổikiểu char a = ‘a’; char* p1 = &a; int* p2 = (int*)p1; *p2 = ‘b’;• Rủiro,khôngkhuyếnkhích• Trìnhbiêndịchcảnhbáo• Phảiđổikiểulàdấuhiệucủathiếtkếtồi void*• Kiểucontrỏtrỏđếnloạidữliệukhôngxác địnhkiểu.• Lậptrìnhviêntựchịutráchnhiệmépkiểu Hằngcontrỏ• Đọctừphảisangtráiconstint*p1=&a;//contrỏtớihằngintint*constp2=&b;//hằngcontrỏconstint*constp3=&c;//hằngcontrỏtớihằngintHằngcontrỏ
Nội dung trích xuất từ tài liệu:
Bài giảng Lập trình nâng cao - Chương 7: Con trỏ Contrỏ LậptrìnhnângcaoMộtsốnộidunglấytừslicecủaUriDekel,CMU Outline• Cơchếbộnhớ• Cáchsửdụng• Cơchếtruyềnthamsố – Truyềnbằngcontrỏ-Pass-by-pointer• Lỗithườnggặp• Cácphéptoán – Đổikiểu,+,-,++,--• Contrỏvàmảng Cơchếbộnhớ• Contrỏlàmộtbiến – Nócómộtđịachỉvàlưumộtgiátrị – Nhưnggiátrịcủanóđượchiểulàđịachỉbộnhớ.• Xx; //biếnkiểuX• X*p; //biếnkiểucontrỏtớigiátrịkiểuX• Kíchthướccủacontrỏkhôngphụthuộckiểudữliệu nótrỏtới. Gángiátrịchocontrỏ Gángiátrịsố Gánđịachỉcủabiến GángiátrịcontrỏkhácGánđịachỉcủahàm(ngoàichươngtrình) Dereferencing LấygiátrịbiếncontrỏtrỏtớiNếupXlàcontrỏthì(*pX)truynhậpvùngnhớpXtrỏtới.-(*pC1)tươngđươngvớic-ctươngđươngvới(*(&c))Dereferencing-Vídụ Cóthểdùng(*pX)tươngtự nhưdùngbiếnmàpXtrỏtới - Đọcgiátrị - Ghigiátrịmới - Trảvềgiátrị pass-by-pointervoid swap(int* px, int* py) { int c; c = *px; *px = *py; *py = c;}int main() { int a = 20; int b = 25; swap(&a, &b); cout pass-by-pointervoid swap(int* px, int* py) { int c; c = *px; *px = *py; *py = c;}int main() { int a = 20; int b = 25; swap(&a, &b); cout pass-by-pointervoid swap(int* px, int* py) { int c; c = *px; *px = *py; *py = c;}int main() { int a = 20; int b = 25; swap(&a, &b); cout pass-by-pointervoid swap(int* px, int* py) { int c; c = *px; *px = *py; *py = c;}int main() { int a = 20; int b = 25; swap(&a, &b); cout pass-by-pointervoid swap(int* px, int* py) { int c; c = *px; *px = *py; Thamsốlàcontrỏ *py = c;}int main() { int a = 20; Đốisốlàđịachỉ int b = 25; swap(&a, &b); cout Lỗithườnggặp–contrỏchưakhởitạo• Contrỏchưakhởitạocóthểchứadữliệurác –địachỉngẫunhiên• Truynhậpchúngdẫnđếncáclỗighiđèdữ liệu,ghivàovùngcấmghi….segmenta~on faults,v.v..Lỗithườnggặp:truynhậpcontrỏnull• Tươngđươngtruynhậpđịachỉ0trongbộ nhớ Lỗithườnggặp:danglingreferences• danglingreference:truynhậptớivùngnhớkhông cònhợplệ• Vídụ:trảvềcontrỏtớibiếnđịaphương int* weird_sum(int a, int b) { int c; c = a + b; return &c; }• Lờikhuyên:đừnggiữcontrỏtớibiếncóphạmvi nhỏhơnchínhbiếncontrỏđó. Đổikiểu char a = ‘a’; char* p1 = &a; int* p2 = (int*)p1; *p2 = ‘b’;• Rủiro,khôngkhuyếnkhích• Trìnhbiêndịchcảnhbáo• Phảiđổikiểulàdấuhiệucủathiếtkếtồi void*• Kiểucontrỏtrỏđếnloạidữliệukhôngxác địnhkiểu.• Lậptrìnhviêntựchịutráchnhiệmépkiểu Hằngcontrỏ• Đọctừphảisangtráiconstint*p1=&a;//contrỏtớihằngintint*constp2=&b;//hằngcontrỏconstint*constp3=&c;//hằngcontrỏtớihằngintHằngcontrỏ
Tìm kiếm theo từ khóa liên quan:
Bài giảng Lập trình nâng cao Kỹ thuật lập trình Con trỏ Cơ chế bộ nhớ Cách sử dụng con trỏ Cơ chế truyền tham sốGợi ý tài liệu liên quan:
-
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 262 0 0 -
NGÂN HÀNG CÂU HỎI TRẮC NGHIỆM THIẾT KẾ WEB
8 trang 203 0 0 -
Giới thiệu môn học Ngôn ngữ lập trình C++
5 trang 193 0 0 -
Bài giảng Nhập môn về lập trình - Chương 1: Giới thiệu về máy tính và lập trình
30 trang 163 0 0 -
Luận văn: Nghiên cứu kỹ thuật giấu tin trong ảnh Gif
33 trang 152 0 0 -
Báo cáo thực tập Công nghệ thông tin: Lập trình game trên Unity
27 trang 118 0 0 -
Giáo trình về phân tích thiết kế hệ thống thông tin
113 trang 114 0 0 -
LUẬN VĂN: Tìm hiểu kỹ thuật tạo bóng cứng trong đồ họa 3D
41 trang 107 0 0 -
Bài giảng Kỹ thuật lập trình - Chương 10: Tổng kết môn học (Trường Đại học Bách khoa Hà Nội)
67 trang 105 0 0 -
Giáo trình Nhập môn lập trình VB6: Phần 2
184 trang 89 0 0