Xin coi đoạn mã sau : (VC++ 6.0) #include <stdio.h> #include <conio.h> void main() { int a[5]; // mang 5 phan tu : a[0] a[1] ... a[5] int *intp; // con tro kieu int intp = (int *)(&a); // cach 01 //intp = (int *)a; // cach 02 //intp = a; // cach 03 //intp = &a; // cach 04 *(intp+1) = 1; // gan gia tri 1 vao phan tu thu 2 = a[1] printf("%d", *(intp+1)); // in ra getch(); } Trong cả 3 cách đầu tiên : gán địa chỉ mảng a[5] cho con trỏ đều cho kết quả đúng ! Nhưng cách thứ 04 : intp = &a; lại báo lỗi ! Có bro nào biết vì sao kô vậy ? Xin chỉ giúp.
Phép toán &(variable) trả về con trỏ đến nó. Ví dụ : &n trả về con trỏ đến n. Nếu n là int thì trả về int*, nếu n là int* thì trả về int**. Cách 4 lỗi vì gán không đúng kiểu: int* = int** Cách 3 là hợp lí. Cách 2 hơi thừa vì a đã là int*. Cách 1 dùng mã không an toàn. Nhưng vì a và &a đều cho kết quả là địa chỉ đầu mảng a nên kết quả vẫn đúng.
Sorry, tui đã lẫn lộn 1 tí. Trong C++ mảng không phải là con trỏ như C#. Tôi xin đính chính lại thế này: Cách 4: gán không hợp lệ int* = int[5] Cách 3: gán hợp lệ int* = int[] Cách 2: ép kiểu không cần thiết vì int[] có thể gán trực tiếp cho int* như cách 3. Cách 1: biểu thức a hay &a đều cho kết quả là địa chỉ đầu mảng a nên cách 1 và 2 có kết quả như nhau. Để hiểu rõ hơn ban chạy thử đoạn code này. Mã: #include<iostream.h> int main() { int* p; int a[5]; for(int i = 0 ; i < 5 ; i++) cout << "Address of a[" << i << "] : " << a+i << endl; cout << "Expression a return : " << a << endl; cout << "Expression &a return : " << &a << endl; cout << endl; p = a; a[0] = 100; cout << "Value of p : " << p << endl << "Address of p : " << &p << endl << "p point to value : " << *p << endl; return 0; }