• Các giá trị con trỏ có thể xuất dữ liệu với toán tử chèn <<.
• Các con trỏ không thể nhập dữ liệu. Nếu p là con trỏ thì lệnh nhập sau là sai:
cin >> p; // Error
• Các con trỏ có thể đ−ợc gán cho những con trỏ khác cùng kiểu. Ví dụ:
float *px, *py, x; px = &x;
py = px;
• Các con trỏ có thể đ−ợc tăng hay giảm. Ví dụ:
char st[] = “ABCDEFGH”;
char p = &st[3]; // p trỏ tới st[3]
cout << “*p = “ << *p << endl; ++p; // p trỏ tới st[4] cout << “*p = “ << *p << endl; p += 3; // p trỏ tới st[7] cout << “*p = “ << *p << endl; p -=6; // p trỏ tới st[1]
cout << “*p = “ << *p << endl;
--p; // p trỏ tới st[0]
cout << “*p = “ << *p << endl; Kết quả của đoạn ch−ơng trình trên sẽ là:
*p = D *p = E *p = H *p = B *p = A 5.2. Con trỏ và mảng 5.2.1. Con trỏ và mảng một chiều Con trỏ th−ờng đ−ợc sử dụng khi xử lý các mảng. Chúng ta phân tích ch−ơng trình 5.2 sau đây:
void main() {
int a[10], *pa, x;
a[0] = 11; a[1] = 22; a[2] = 33; a[3] = 44; pa = &a[0]; x = *pa; pa++; x = *pa; x = *pa + 1; x = *(pa + 1); x = *++pa; x = ++*pa; x = *pa++; getch(); }
int a[10], *pa, x; Khai báo mảng 10 số nguyên a[0], a[1], ... a[9], con trỏ pa chỉ vào số nguyên và biến nguyên x.
a[0] = 1; ... khởi đầu các phần tử của mảng. Các phần tử từ a[4] tới a[9] còn ch−a đ−ợc khởi đầu, chúng tình cờ chứa các giá trị có sẵn trong bộ nhớ.
pa = &a[0]; Đ−a địa chỉ của phần tử đầu tiên của mảng a vào pa. Lệnh này có thể đ−ợc viết đơn giản hơn là: pa = a;
x = *pa; Lấy nội dung của số nguyên đ−ợc pa trỏ vào (tức là a[0]) gán cho biến x. Do đó x có giá trị bằng 11. a[0]) gán cho biến x. Do đó x có giá trị bằng 11.
pa++; pa đ−ợc tăng một đơn vị, bây giờ nó chứa địa chỉ của phần tử thứ hai, đó là địa chỉ của a[1] tức là pa trỏ vào a[1].
x = *pa; *pa là nội dung của a[1], do đó x có giá trị băng 22.
x = *pa + 1; Cho x giá trị a[1] + 1, do đó x có giá trị là 22 + 1 = 23. 23.
x = *(pa + 1); Tr−ớc tiên hệ thống thực hiện phép toán: pa + 1
điều đó cho kết quả là địa chỉ của a[2], số nguyên ở địa chỉ này đ−ợc đ−a vào x, do vậy x bằng 33.
Chú ý rằng nếu pa tham gia vào phép toán nó không bị thay đổi.
x = *++pa; Theo độ −u tiên của các toán tử, phép toán ++pa đ−ợc thực hiện tr−ớc, do đó pa chứa địa chỉ của a[2]. thực hiện tr−ớc, do đó pa chứa địa chỉ của a[2].
Sau đó thực hiện phép toán *, x chứa địa chỉ a[2] tức là x = 33.
x = ++*pa; Đầu tiên thực hiện *pa, pa đang trỏ vào a[2] nên *pa bằng 33, do đó ++*pa bằng 34, do vậy x bằng 34. bằng 33, do đó ++*pa bằng 34, do vậy x bằng 34.
x = *pa++; Nội dung của *pa đ−ợc đặt vào biến x tr−ớc nên x bằng 34, sau đó pa đ−ợc tăng một đơn vị và bây giờ bằng 34, sau đó pa đ−ợc tăng một đơn vị và bây giờ nó trỏ vào a[3].
Qua phân tích ví dụ trên ta thấy rằng: Nếu con trỏ pa trỏ tới phần tử a[k] nào đó thì:
pa + i trỏ tới phần tử thứ i sau a[k], tức là phần tử a[k+i]. pa – i trỏ tới phần tử thứ i tr−ớc a[k], tức là phần tử a[k-i]. *(pa + i) t−ơng đ−ơng với pa[i].