[Wiki] Phân biệt con trỏ hằng và hằng con trỏ
Hai định nghĩa và ví dụ sau đây sẽ giúp bạn hiểu rõ hơn về bản chất của
- Con trỏ hằng
- Hằng Con trỏ
Con trỏ hằng
Là con trỏ trỏ đến vùng dữ liệu hằng. Ta ko thể thay đổi giá trị mà nó đang trỏ đến. Nhưng có thể
thực hiện tăng giảm địa chỉ con trỏ hay cho nó trỏ đi nơi khác.
Khai báo:
const int* p;
Ví dụ:
void main()
{
int x =5;
int y = 10;
int *q;
q = &y;
const int* p = &x;
*p = 6; // lỗi biên dịch
p = q; // OK
}
Hằng con trỏ:
Là 1 con trỏ nếu trỏ vào 1 ô nhớ nào đó. Thì nó sẽ nằm “dính chặt” vào ô nhớ đó. Ta không thể
cho nó trỏ đi nơi khác và tăng giảm địa chỉ của con trỏ. Nhưng ta có thể thay đổi được giá trị mà nó trỏ đến.
Khai báo:
int* const p;
Ví dụ:
void main()
{
int x =5;
int y = 10;
int *q;
q = &y;
int* const p = &x;
p = &q; // ERROR
*p = 6; // OK
}
Chào mn, em có đọc số tài liệu có nói mảng là con trỏ hằng, mà theo định nghĩa “Là con trỏ trỏ đến vùng dữ liệu hằng. Ta ko thể thay đổi giá trị mà nó đang trỏ đến. Nhưng có thể
thực hiện tăng giảm địa chỉ con trỏ hay cho nó trỏ đi nơi khác.” của con trỏ hằng thì không hợp lí lắm vì vd như lệnh A[4]=5 chẳng hạn, thì tức là đã thay đổi giá trị của nó đang trỏ đến rồi, còn việc mang A đi trỏ vào vùng dữ liệu khác là điều dĩ nhiên không thể rồi, vậy theo em nghĩ mảng là 1 hằng con trỏ không biết có đúng không?
Mảng (các ô nhớ ấy) đâu có hằng nhưng nó ko giống con trỏ đâu. Như &a với a cùng hiện một số. http://ideone.com/ZEUsnk do mảng là đại diện cho một dãy ô nhớ rồi nên nó không “thực”, mà đã ko phải là thực thì & của nó là j.
Còn con trỏ thì &p là địa chỉ của nó, p là địa chỉ nó trỏ đến. Nhưng hai cái này đều chung 1 điểm là &p[i] == p+i.