01/10/2018, 11:54
Con trỏ chứa giá trị là địa chỉ, vậy tại sao lại không gán địa chỉ con trỏ cho như cách gán biến thông thường?
void main()
{
int *a;
int *b;
printf("%p",&a);
printf("%p",&b);
//a=&b(lỗi);
printf("%p",a);
printf("%p",b);
}
con trỏ chứa giá trị là địa chỉ vậy tại sao lại ko gán địa chỉ con trỏ cho như cách gán biến thông thường ?
Bài liên quan
Hi Nguyễn Phú Thành.
Vì nó không đúng kiểu a là con trỏ đến một biến kiểu nguyên b là một con trỏ kiểu nguyên.
Vì bạn đang gán địa chỉ đến con trỏ vào con trỏ. Không phải địa chỉ nào cũng giống nhau.
chẳng phải con trỏ chứa địa chỉ sao.thế sao lại ko gán địa chỉ con trỏ b vào con trỏ a đc ? con trỏ cũng là 1 biến bình thường như bao biến khác mà.
Con trỏ có công dụng chính là quản lí vùng nhớ. Rõ ràng mảng 1 chiều không thể gán cho 2 chiều và ngược lại.
mình mới tìm hiểu con trỏ thôi,chỉ nghe rất nhiều lần là con trỏ là 1 biến bình thường như mọi biến khác chỉ khác 1 điều là giá trị của nó là 1 địa chỉ chứ đâu có đề cập gì đến mảng đâu,thế nên mình mới thử 1 hàm đơn giản là gán địa chỉ b cho a và ngược lại rồi in ra là giá trị của a sau khi gán chắc chắn nó phải là địa chỉ của con trỏ b nhưng khi gán thì gặp lỗi và thắc mắc tại sao lại ko thể nó là 1 biến bình thường mà.
Hi Nguyễn Phú Thành.
Cái này liên quan đến các phép toán trên con trỏ &, ++, --, v.v.v… Bạn cần biết kiểu của con trỏ để từ đó tính toán tường ứng. VD nếu là int *a; thì a++ tăng giá trị của a thêm sizèo(int) còn nếu float * thì là sizèo(float). Hay phép & cũng tương tự.
Hi Nguyễn Phú Thành.
Đúng là nó là một biến bình thường. Và biến thì phải có kiểu khi gán thì phải gán đúng kiểu.
chưa đụng gì đến phép toán đâu mấy cái căn bản nhất thôi,mình chỉ làm theo định nghĩa của con trỏ thôi bạn sao nó định nghĩa vậy mà lại ko đc ấy.
Hi Nguyễn Phú Thành.
chẳng hiểu gì hết
Hi Nguyễn Phú Thành.
Một cách trực quan
int *p
(như một cái cốc) nó trỏ đến một biến kiểu nguyênint a
(cốc chỉ chứa được nước) nó không thể trỏ đến một biến kiểu con trỏint *pb
(một cái cốc thì không thể chứa được một cái cốc). Trừ khi dùng biến kiểu con trỏ của con trỏint **p2
(một cái thùng) khi đó bạn có thể gán đượcint **p2 = &pb
(thùng có thể chứa được cốc).sau khi thử thì gán đc nhưng có cách nào để mình khai báo chỉ 1 dấu sao nhưng vẫn gán đc cho biến b ko con trỏ rắc rối quá.lỗi cannot convert from ‘int **’ to ‘int *’
Hi Nguyễn Phú Thành.
int *p = (int *)pb
.đã ép như vậy và còn có 1 cách khác nữa là
a=*(&b)
hợp lệ nhưng khi in nó là 1 dẫy kí tự CCCCCCCa = *&b
là hiển nhiên rồi, còn in vậy là do bạn có trỏ cái gì đâu nên nó gán sẵn (debug mode).chỉ có cách làm như lỗi thì nó mới đc còn cách nào cũng ra vậy làm vậy thì mình chỉ lấy đc địa chỉ b còn gán ngược lại thì ko đc.
Hi Nguyễn Phú Thành.
a=*(&b)
Không nhầm thì nó làa = b
.P/S Có vẻ bạn chưa hiểu lắm về con trỏ.
đa số chỉ gán 1 con trỏ cho 1 biến thông thường còn cái vụ con trỏ gán địa chỉ con trỏ khác thì ko ai nói đến.
Vì trường hợp đó rất khó gặp.
Với p là con trỏ cấp 2 (T**) và q là T* thì vẫn có thể viết
p[i] = q;
từ lúc học con trỏ mình ko có hiểu trừu tượng int a hay int *p nữa mà chuyển qua vẽ ô rồi gán nó 1 cái địa chỉ rồi,2 con trỏ a và b nó là 1 cái ô có địa chỉ nếu mình làm như cách gán biến thông thường thì con trỏ a chứa địa chỉ b và ngược lại như vậy nó dễ hiểu hơn giờ tự nhiên phải ép kiểu mặc dù nó đã cùng kiểu int rồi như
int a,b; a=b;
nên mình nghĩ con trỏ cũng như thế.