Tóm tắt lý thuyet session 13: pointers

-----Tóm tắt lý thuyest session 13: pointers-----
+Con trỏ là gì: Một con trỏ  là một biến, nó chứa địa chỉ vùng nhớ của một biến khác, chứ không lưu trữ giá trị của biến đó. Nế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ỏ đến biến thứ hai kia.

+Con trỏ có thể được sử dụng trong một số trường hợp sau:
Để trả về nhiều hơn một giá trị từ một hàm
Thuận tiện hơn trong việc truyền các mảng và chuỗi từ một hàm đến một hàm khác
Sử dụng con trỏ để 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ớ động và truy xuất vào vùng nhớ được cấp phát này (dynamic memory allocation)

+Các biến con trỏNếu một biến được sử dụng như một con trỏ, nó phải được khai báo trước. Câu lệnh khai báo con trỏ bao gồm một kiểu dữ liệu cơ bản, một dấu *, và một tên biến. Cú pháp tổng quát để khai báo một biến con trỏ như sau:
          type *name;

+Các toán tử con trỏ: Có hai toán tử đặc biệt được dùng với con trỏ: * &. Toán tử &  là một toán tử một ngôi và nó trả về địa chỉ của toán hạng. Ví dụ,
          var2 = &var1;

Gán giá trị cho con trỏ: Các giá trị có thể được gán cho biến con trỏ thông qua toán tử &. Câu lệnh gán sẽ là:        ptr_var = &var;

+ Phép toán số học con trỏ: Chỉ phép cộng và trừ là các toán tử có thể thực hiện trên các con trỏ. Ví dụ sau minh họa điều này: 
         int var, *ptr_var;
         ptr_var = &var;
         var = 500;

So sánh con trỏ: Hai con trỏ có thể được so sánh trong một biểu thức quan hệ. Tuy nhiên, điều này chỉ có thể nếu cả hai biến này đều trỏ đến các biến có cùng kiểu dữ liệu. ptr_aptr_b là hai biến con trỏ trỏ đến các phần tử dữ liệu ab. Trong trường hợp này, các phép so sánh sau đây là có thể thực hiện:

ptr_a < ptr_b
Trả về giá trị true nếu a được lưu trữ ở vị trí trước b
ptr_a > ptr_b
Trả về giá trị true nếu a được lưu trữ ở vị trí sau b
ptr_a <= ptr_b
Trả về giá trị true nếu a được lưu trữ ở vị trí trước b hoặc ptr_a và ptr_b trỏ đến cùng một vị trí
ptr_a >= ptr_b
Trả về giá trị true nếu a được lưu trữ ở vị trí sau b hoặc ptr_a và ptr_b trỏ đến cùng một vị trí
ptr_a == ptr_b
Trả về giá trị true nếu cả hai con trỏ ptr_a và ptr_b trỏ đến cùng một phần tử dữ liệu.
ptr_a != ptr_b
Trả về giá trị true nếu cả hai con trỏ ptr_a và ptr_b trỏ đến các phần tử dữ liệu khác nhau nhưng có cùng kiểu dữ liệu.
ptr_a == NULL
Trả về giá trị true nếu ptr_a được gán giá trị NULL (0)

Con trỏ và mảng một chiều: Tên của một mảng thật ra là một con trỏ trỏ đến phần tử đầu tiên của mảng đó. Vì vậy, nếu ary là một mảng một chiều, thì địa chỉ của phần tử đầu tiên trong mảng có thể được biểu diễn là &ary[0] hoặc đơn giản chỉ là ary. Tương tự, địa chỉ của phần tử mảng thứ hai có thể được viết như &ary[1] hoặc ary+1,... Tổng quát, địa chỉ của phần tử mảng thứ (i + 1) có thể được biểu diễn là &ary[i] hay (ary+i). Như vậy, địa chỉ của một phần tử mảng bất kỳ 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 cộng vào tên của mảng.

+Con trỏ và mảng nhiều chiều: Một mảng nhiều chiều cũng có thể được biểu diễn dưới dạng con trỏ của mảng một chiều (tên của mảng) và một độ dời (chỉ số). Thực hiện được điều này là bởi vì một mảng nhiều chiều là một tập hợp của các mảng một chiều: ví dụ: data_type (*ptr_var)[exp 2] .... [exp N];

Cấp phát bộ nhớ: Cho đến thời điểm này thì chúng ta đã biết là tên của một mảng thật ra là một con trỏ trỏ tới phần tử đầu tiên của mảng. Hơn nữa, ngoài cách định nghĩa một mảng thông thường có thể định nghĩa một mảng như là một biến con trỏ. Tuy nhiên, nếu một mảng được khai báo một cách bình thường, kết quả là một khối bộ nhớ cố định được dành sẵn tại thời điểm bắt đầu thực thi chương trình, trong khi điều này không xảy ra nếu mảng được khai báo như là một biến con trỏ. Sử dụng một biến con trỏ để biểu diễn một mảng đòi hỏi việc gán một vài ô nhớ khởi tạo trước khi các phần tử mảng được xử lý. Sự cấp phát bộ nhớ như vậy thông thường được thực hiện bằng cách sử dụng hàm thư viện malloc().

Comments

Popular Posts