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:
+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ỏ: * và
&. 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_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 đâ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
Post a Comment