Toán tử địa chỉ (&)
66
Kết quả của phép lấy địa chỉ (&) là một con trỏ, do đó có thể dùng để gán cho một biến pointer.
Ví dụ 5.12:
a) int *px, num;
// px là một pointer chỉ đến biến kiểu int là num. px = #
//xuất địa chỉ của biến num dạng số hệ 16 (hệ hexa)
printf(“%x”, &num); b) int *px, num;
px = &(num +4); // SAI vì ( num+4) không phải là
một biến cụ thể
Lưu ý: Chúng ta thấy cú pháp lệnh nhập dữ liệu scanf (lệnh đã được học ở
chương 2) trong ngôn ngữ lập trình C luôn có dấu & trước biến cần nhập. Điều này xác định cần đưa dữ liệu vào con trỏ chứa địa chỉ của biến tương ứng. Toán tử nội dung (*)
Toán tử lấy nội dung của một địa chỉ được kí hiệu là dấu * trước một pointer, dùng để lấy giá trị của biến mà con trỏ đang trỏ đến.
Xét lại ví dụ 5.12, ta có:
px là một pointer chỉ đến biến num như ví dụ 5.12 a, thì * px là giá trị của biến num.
Ví dụ 5.13:
a) //num là biến được khai báo và gán giá trị là 10. int num = 10 ;
int *px; // px là một con trỏ chỉ đến kiểu int px= &num ; //px là địa chỉ của biến num.
/*giá trị của *px (tức là num) cộng thêm 3, gán cho k. Sau đó *px thực hiện lệnh tăng 1 đơn vị (++)*/ int k = (* px)++ + 3 ;
// Sau câu lệnh trên num = 11, k = 13 b) int num1 = 2, num2, *pnt;
pnt = &num1 num2 = *pnt;
67
Trong ví dụ trên, biến num1 được gán bằng 2. Dòng pnt = &num1 nghĩa là biến con trỏ pnt chứa địa chỉ của biến num1. Phép gán num2 = *pnt, dấu ‘*’ được đặt ở phía trước biến con trỏ, thì giá trị trả về của biến này l giá trị của biến được trỏ tới bởi con trỏ pnt. Do đó, num2 có giá trị là 2.
Ta minh họa qua hình vẽ sau :
Lưu ý : NULL là hằng khi pointer mang ý nghĩa không chứa một địa chỉ
nào cả. Ta gọi là pointer rỗng.