Bài giảng Captech - Chương 8: Con trỏ

Mục tiêu bài học

Tìm hiểu về con trỏ và khi nào thì sử dụng con trỏ

Cách sử dụng biến con trỏ và các toán tử con trỏ

Gán giá trị cho con trỏ

Phép toán trên con trỏ

So sánh con trỏ

Con trỏ và mảng một chiều

Con trỏ và mảng nhiều chiều

Tìm hiểu cách cấp phát bộ nhớ

ppt30 trang | Chia sẻ: hienduc166 | Lượt xem: 861 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Captech - Chương 8: Con trỏ, để xem tài liệu hoàn chỉnh bạn click vào nút TẢI VỀ ở trên
Con trỏBài 8Mục tiêu bài họcTìm hiểu về con trỏ và khi nào thì sử dụng con trỏCách sử dụng biến con trỏ và các toán tử con trỏGán giá trị cho con trỏPhép toán trên con trỏSo sánh con trỏCon trỏ và mảng một chiềuCon trỏ và mảng nhiều chiềuTìm hiểu cách cấp phát bộ nhớCon trỏ là gì?Con trỏ là một biến, nó chứa địa chỉ ô nhớ của một biến khácNếu một biến chứa địa chỉ của một biến khác, thì biến này được gọi là con trỏ trỏ đến biến thứ haiCon trỏ cung cấp phương thức truy xuất gián tiếp đến giá trị của một phần tử dữ liệu Các con trỏ có thể trỏ đến các biến có kiểu dữ liệu cơ bản như int, char, double, hay dữ liệu tập hợp như mảng hoặc cấu trúc.Con trỏ được sử dụng để làm gì?Các tình huống con trỏ có thể được sử dụng: Để trả về nhiều hơn một giá trị từ một hàmĐể truyền mảng và chuỗi từ một hàm đến một hàm khác thuận tiện hơnĐể làm việc với các phần tử của mảng thay vì truy xuất trực tiếp vào các phần tử nàyĐể cấp phát bộ nhớ và truy xuất bộ nhớ (Cấp phát bộ nhớ trực tiếp)Biến con trỏKhai báo con trỏ: chỉ ra một kiểu cơ sở và một tên biến được đặt trước bởi dấu *Cú pháp khai báo tổng quát: Ví dụ:type *name;int *var2;Các toán tử con trỏ Hai toán tử đặc biệt được sử dụng với con trỏ: & là toán tử một ngôi và nó trả về địa chỉ ô nhớ của toán hạngToán tử * là phần bổ xung của toán tử &. Đây là toán tử một ngôi và nó trả về giá trị chứa trong vùng nhớ được trỏ đến bởi biến con trỏvà&*var2 = &var1;temp = *var2;Gán trị đối với con trỏCác giá trị có thể được gán cho con trỏ thông qua toán tử &.	ptr_var = &var; Ở đây địa chỉ của var được lưu vào biến ptr_var.Cũng có thể gán giá trị cho con trỏ thông qua một biến con trỏ khác trỏ có cùng kiểu.	 ptr_var = &var; ptr_var2 = ptr_var;Elementary Programming with C/Session 8/ Slide of 30 Có thể gán giá trị cho các biến thông qua con trỏ *ptr_var = 10; Câu lệnh trên gán giá trị 10 cho biến var nếu ptr_var đang trỏ đến varGán trị đối với con trỏ (tt)Elementary Programming with C/Session 8/ Slide of 30Phép toán con trỏChỉ có thể thực hiện phép toán cộng và trừ trên con trỏ	int var, * ptr_var;	ptr_var = & var;	var = 500;	ptr_var ++; Giả sử biến var được lưu trữ tại địa chỉ 1000ptr_var lưu giá trị 1000. Vì số nguyên có kích thước là 2 bytes, nên sau biểu thức “ptr_var++;” ptr_var sẽ có giá trị là 1002 mà không là 1001Elementary Programming with C/Session 8/ Slide of 30Phép toán con trỏ (tt)Elementary Programming with C/Session 8/ Slide of 30Mỗi lần con trỏ được tăng trị, nó trỏ đến ô nhớ của phần tử kế tiếpMỗi lần con trỏ được giảm trị, nó trỏ đến ô nhớ của phần tử đứng trước nóTất cả con trỏ sẽ tăng hoặc giảm trị theo kích thước của kiểu dữ liệu mà chúng đang trỏ đếnPhép toán con trỏ (tt)Elementary Programming with C/Session 8/ Slide of 30So sánh con trỏHai con trỏ có thể được so sánh trong một biểu thức quan hệ nếu chúng trỏ đến các biến có cùng kiểu dữ liệuGiả sử ptr_a và ptr_b là hai biến con trỏ trỏ đến các phần tử dữ liệu a và b. Trong trường hợp này, các phép so sánh sau là có thể: Elementary Programming with C/Session 8/ Slide of 30So sánh con trỏ (tt)Elementary Programming with C/Session 8/ Slide of 30Con trỏ và mảng một chiều Địa chỉ của một phần tử mảng có thể được biểu diễn theo hai cách:Sử dụng ký hiệu & trước một phần tử mảng.Sử dụng một biểu thức trong đó chỉ số của phần tử được cộng vào tên của mảng.Elementary Programming with C/Session 8/ Slide of 30#includevoid main(){	static int ary[10] 	={1,2,3,4,5,6,7,8,9,10};	int i;	for (i= 0;i#include void main (){	char a, str[81], *ptr;	printf(“\nEnter a sentence:”);	gets(str);	printf(“\nEnter character to search for:”);	a = getche();	ptr = strchr(str,a);	/* return pointer to char*/	printf( “\nString starts at address: %u”,str);	printf(“\nFirst occurrence of the character is at address: %u ”,ptr);	printf(“\n Position of first occurrence(starting from 	0)is: % d”, ptr_str);}Elementary Programming with C/Session 8/ Slide of 30Con trỏ và chuỗi (tt)Elementary Programming with C/Session 8/ Slide of 30Cấp phát bộ nhớ Hàm malloc() là một trong các hàm được sử dụng thường xuyên nhất để thực hiện việc cấp phát bộ nhớ từ vùng nhớ còn tự do. Tham số của hàm malloc() là một số nguyên xác định số bytes cần cấp phát. Elementary Programming with C/Session 8/ Slide of 30Cấp phát bộ nhớ (tt)Elementary Programming with C/Session 8/ Slide of 30Hàm free()Hàm free() được sử dụng để giải phóng bộ nhớ khi nó không cần dùng nữa. Cú pháp:void free(void*ptr);Hàm này giải phóng không gian được trỏ bởi ptr, để dùng cho tương lai. ptr phải được dùng trước đó với lời gọi hàm malloc(), calloc(), hoặc realloc(). Elementary Programming with C/Session 8/ Slide of 30#include #include 	/*required for the malloc and free functions*/int main(){ int number; int *ptr; int i; printf("How many ints would you like store? "); scanf("%d", &number); ptr = (int *) malloc (number*sizeof(int)); 	/*allocate memory */ 	if(ptr!=NULL) { for(i=0 ; i0 ; i--) { 	printf("%d\n",*(ptr+(i-1))); 	/* print out in reverse order */	} 	free(ptr); /* free allocated memory */ 	return 0;}else { printf("\nMemory allocation failed - 	not enough memory.\n"); return 1; }}Hàm free() - ttElementary Programming with C/Session 8/ Slide of 30Hàm calloc() calloc tương tự như malloc, nhưng điểm khác biệt chính là mặc nhiên giá trị 0 được lưu vào không gian bộ nhớ vừa cấp phátcalloc yêu cầu hai tham sốTham số thứ nhất là số lượng các biến cần cấp phát bộ nhớTham số thứ hai là kích thước của mỗi biếnCú pháp:	void *calloc( size_t num, size_t size );Elementary Programming with C/Session 8/ Slide of 30#include #include int main() { float *calloc1, *calloc2; int i; calloc1 = (float *) calloc(3, sizeof(float)); calloc2 = (float *)calloc(3, sizeof(float)); if(calloc1!=NULL && calloc2!=NULL){ for(i=0 ; i#include int main(){ int *ptr; int i; ptr = (int *)calloc(5, sizeof(int *));	if(ptr!=NULL) { *ptr = 1; *(ptr+1) = 2; ptr[2] = 4; ptr[3] = 8; ptr[4] = 16; ptr = (int *)realloc(ptr, 7*sizeof(int)); if(ptr!=NULL){ printf("Now allocating more memory...\n"); ptr[5] = 32; /* now it's legal! */ ptr[6] = 64;Hàm realloc() - ttElementary Programming with C/Session 8/ Slide of 30	for(i=0;i<7;i++) { printf("ptr[%d] holds %d\n", i, ptr[i]);	} realloc(ptr,0); 	/* same as free(ptr); - just fancier! */ return 0; } else { printf("Not enough memory-realloc failed.\n"); return 1; } }else { printf("Not enough memory-calloc failed.\n"); return 1; }}Hàm realloc() - ttElementary Programming with C/Session 8/ Slide of 30

File đính kèm:

  • pptSession 13.ppt
Bài giảng liên quan