VII Kiểu trỏ Khái niệm Con trỏ biến chứa địa biến khác Trong C trỏ sử dụng nhiều coi mạnh biểu diễn tính toán truy nhập gián tiếp đối tượng Sử dụng biến trỏ Khai báo trỏ: *; Ví dụ: int *p; //Khai báo trỏ p trỏ đến kiểu liệu int hay p trỏ kiểu int Gán địa biến cho biến trỏ = &; Ví dụ: int x, *p; p=&x; Lưu ý: Chỉ gán địa biến kiểu với biến trỏ Ví dụ: int x; float *p; p=&x ; //sai Truy cập biến thông qua biến trỏ: *; Ý nghĩa: Lấy nội dung vùng nhớ mà trỏ trỏ đến Ví dụ: Các lệnh sau khai báo gán địa cho biến trỏ int x=10,y; int *p; p=&x; y=*p; // y=10; lấy nội dung vùng nhớ x mà trỏ p trỏ đến để gán cho y Cấp phát vùng nhớ cho biến trỏ Biến tĩnh: Biến xác định rõ ràng lúc mô tả kiểu khai báo biến int a, b; Biến động: Biến tạo cách “động” lúc chạy chương trình, tuỳ theo nhu cầu, số biến không xác định trước Các biến động tên Để sử dụng biến động dùng biến trỏ Ví dụ: Khai báo trỏ tạo biến động int *pnumber; //khai báo biến trỏ pnumber= (int *) malloc(100); //tạo biến động //Ý nghĩa: cấp phát 100 bytes nhớ gán địa khối nhớ cho pnumber Cấp phát biến động: int, char, long, float, double (data type *) malloc (số ô nhớ cần cấp phát) VD: (int *) malloc(20); (char *) malloc(30); Cấp phát biến động: kiểu người lập trình tạo ra, dùng cho kiểu sở (data type *) calloc(n, sizeof(object)); n: số lượng object thuộc kiểu data type Ví dụ: (float *) calloc(10,sizeof(float)) Hoặc calloc(10, sizeof(struct nhan_su)); //cấp phát nhớ cho 10 nhân Cấp phát lại nhớ: (datatype *) realloc(pointer, newsize); pointer: trỏ trỏ tới vùng nhớ cấp phát newsize: kích thước Ví dụ: char *str; str=(char *) malloc(10); … str=(char *) realloc(str,20); Giải phóng vùng nhớ: free(pointer) // dùng với malloc, calloc Các ví dụ việc sử dụng trỏ: Ví dụ 1: Các phép toán biến trỏ #include #include void main(){ int i=10,j=20; int *p,*q; p=&i; q=&j; *q=*p+4; p=&j; printf("i=%d \t j=%d \t *p=%d \t *q=%d",i,j,*p,*q); getch(); } Ví dụ 2: Cấp phát sử dụng biến động #include #include void main(){ int *pointer, n,i; printf("Mang co bao nhieu phan tu"); scanf("%d",&n); pointer= (int*) malloc(n*sizeof(int)); for(i=0;i