intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

kỹ thuật lập trình C chuyên nghiệp phần 4

Chia sẻ: Thái Duy Ái Ngọc | Ngày: | Loại File: PDF | Số trang:24

101
lượt xem
6
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tham khảo tài liệu 'kỹ thuật lập trình c chuyên nghiệp phần 4', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả

Chủ đề:
Lưu

Nội dung Text: kỹ thuật lập trình C chuyên nghiệp phần 4

  1. Con trỏ – Pointer Khai Khai báo Cá Các toán tử “&”, “*”, “=”, “+” Nh Nhắc lại về truyền tham số địa chỉ Con Con trỏ và mảng Cấp phát vùng nhớ động hát
  2. Con trỏ – Một số lý do nên sử dụng lý Con Con trỏ là kiểu dữ liệu lưu trữ địa chỉ của các vùng dữ liệu trong bộ nhớ máy tính Kiểu con trỏ cho phép: Ki hép: Truy Truyền tham số kiểu địa chỉ Biểu diễn các kiểu, cấu trúc dữ liệu động Bi Lưu trữ dữ liệu trong vùng nhớ heap Con Con trỏ đã được sử dụng trong hàm scanf
  3. Con trỏ – Khai báo trong C bá Kiểu con trỏ phải được định nghĩa trên một kiểu cơ sở đã h được định nghĩa trước đó. ó. typedef kiểucơsở *Tênkiểu; typedef int *PINT; //PINT là kiểu con trỏ - địa chỉ vùng nhớ kiểu int là int x; PINT p; //p, p1: biến kiểu int * // bi ki int *p1;
  4. Con trỏ – Khai báo trong C bá int *pi; long int *p; int float* pf; char c, d, *pc; /* c và d kiểu char pc là con trỏ đến char */ double* pd, e, f; /* pd là con trỏ đến double e and f are double */ char *start, *end;
  5. Con trỏ - Toán tử “&” “&”: toán tử lấy địa chỉ của 1 biến Đị Địa chỉ của tất cả các biến trong chương trình đều đã được chỉ định từ khi khai báo char g = 'z'; p c int main() 'a' 0x1132 { 0x1132 char c = 'a'; char *p; g p p = &c; &c; 'z' 0x91A2 p = &g; 0x91A2 return 0; }
  6. Con trỏ - Toán tử “*” “*” “*”: toán tử truy xuất giá trị của vùng nhớ được quản lý bởi con trỏ. #include p c char g = 'z'; 'a' 0x1132 int main() 0x1132 a { z char c = 'a'; g p char *p; 'z' 0x91A2 p = &c; 0x91A2 printf("%c\n", *p); xuất giá trị do p đang giá tr do p = &g; &g; quản lý printf("%c\n", *p); return 0; }
  7. Con trỏ - Truyền tham số địa chỉ đị #include void change(int *v); int main() { int var = 5; change(&var); printf("main: var = %i\n", var); return 0; } void change(int *v) { (*v) *= 100; printf("change: *v = %i\n", (*v)); }
  8. Con trỏ NULL NULL Giá Giá trị đặc biệt để chỉ rằng con trỏ không quản lý vùng nào. nào. Giá trị này thường được dùng để chỉ một con trỏ không hợp lệ. #include int main() { int i = 13; short *p = NULL; if (p == NULL) printf(“Con trỏ không hợp lệ!\n"); else printf(“Giá trị : %hi\n", *p); return 0; }
  9. Con trỏ - Toán tử gán “=” Có Có sự khác biệt rất quan trọng khi thực hiện các phép gán: hé n: p i int i = 10, j = 14; 10 14 0x15A0 int* p = &i; 0x15A0 int *q = &j; q j 14 0x15A4 *p = *q; 0x15A4 và: p 0x15A4 i int i = 10, j = 14; 10 0x15A0 int *p = &i; 0x15A0 int *q = &j; q j 14 0x15A4 p = q; q; 0x15A4
  10. Luyện tập – Điền vào ô trống int main(void) i { 0x2100 int i = 10, j = 14, k; 10 14 k; j int *p = &i; 0x2104 int *q = &j; k *p += 1; 0x1208 p = &k; p *p = *q; p = q; 0x120B *p = *q; q 0x1210 return 0; }
  11. Con trỏ và Mảng Bi Biến kiểu mảng là địa chỉ tĩnh của một vùng nhớ, được xác định khi khai báo, không thay đổi trong suốt chu kỳ sống. ng. Bi Biến con trỏ là địa chỉ động của một vùng nhớ, được xác định qua phép gán địa chỉ khi chương trình thực thi. thi. #include
  12. Con trỏ - Toán tử “+” với số nguyên 0x15A0 a #include 1 int main() { 4 3 short a[10] = {1, 3, 5, 2, 0}; 5 short *p = a; 2 printf( printf(“0x%04X %i 0x%04X %i\n“, %i 0x%04X %i a, a[0], p, *p); 0 p ++; … printf(“0x%04X %i 0x%04X %i\n“, %i %i a, a[0], p, *p); (*p) ++; 0x16B2 p printf(“0x%04X %i 0x%04X %i\n“, 0x15A0 0x15A2 a, a[0], p, *p); return 0; }
  13. Con trỏ - Luyện tập #include 2 2 int main() 3 1 { 1 9 int a[10] = {2, 3, 5, 1, 4, 7, 0}; 1 3 int *p = a; printf( printf(“%i %i\n“, a[0], *p); %i a[0] *p); p ++; printf(“%i %i\n“, *p, p[2]); p ++; a[2] = 9; ++ printf(“%i %i\n“, p[1], *p); p -= 2; printf(“%i %i\n”, p[3], p[1]); return 0; }
  14. Con trỏ - Cấp phát vùng nhớ động độ Có Có thể chỉ định vùng mới cho 1 con trỏ quản lý bằng các lệnh hàm malloc, calloc hoặc toán tử new của C++ malloc, Vùng Vùng nhớ do lập trình viên chỉ định phải được giải phóng bằng lệnh free (malloc, calloc) hoặc toán tử delete (new) #include int main() { int *p = new int[10]; p[0] = 1; p[3] = -7; 7; delete []p; return 0; }
  15. Cấp phát động: malloc() và calloc() ng: () Hà Hàm malloc và calloc cho phép cấp phát các vùng nhớ hé hát ngay trong lúc chạy chương trình. trình. void *malloc( size_t size); *malloc( void *calloc( size_t nItems, size_t size); *calloc( nItems, Hàm Hàm calloc cấp phát vùng nhớ và khởi tạo tất cả các bit h bi trong vùng nhớ mới cấp phát về 0. Hàm Hàm malloc chỉ cấp phát vùng nhớ.
  16. Ví dụ 1: dùng malloc() Ví dù #include 1. #include
  17. Ví dụ 1: (tt) Ví (tt) /* copy "Hello" into string */ 13. strcpy(str, "Hello"); "Hello"); 14. /* display string */ 15. printf("String is %s\n", str); str); 16. /* free memory */ 17. free(str); 18. return 0; 19. } 20.
  18. Ví Ví dụ 2: calloc() #include 1. #include
  19. Ví Ví dụ 2: calloc() /* display string */ 11. printf("String is %s\n", str); str); 12. /* free memory */ 13. free(str); free(str); 14. return 0; 15. } 16.
  20. Giải phóng vùng nhớ Gi Khi Khi thoát khỏi hàm, các biến khai báo trong hàm sẽ “biến m, mất”. Tuy nhiên các vùng nhớ được cấp phát động vẫn còn t”. tồn tại và được “đánh dấu” là đang “được dùng” bộ nhớ là của máy tính sẽ hết. t. ví ví dụ: void aFunction(void) aFunction(void) { int *tmpArray, i = 5; tmpArray, tmpArray = (int *)malloc(i * sizeof(int)); sizeof } tmpArray tmpArray i
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2