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 ?

Tao Không Ngu. viết 14:08 ngày 01/10/2018

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.

rogp10 viết 14:00 ngày 01/10/2018

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.

Nguyễn Phú Thành viết 14:02 ngày 01/10/2018

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à.

rogp10 viết 14:07 ngày 01/10/2018

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.

Nguyễn Phú Thành viết 13:58 ngày 01/10/2018

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à.

Tao Không Ngu. viết 14:09 ngày 01/10/2018

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ự.

Tao Không Ngu. viết 14:07 ngày 01/10/2018

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.

Nguyễn Phú Thành viết 13:55 ngày 01/10/2018

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.

Tao Không Ngu. viết 14:04 ngày 01/10/2018

Hi Nguyễn Phú Thành.

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.

Nguyễn Phú Thành viết 14:06 ngày 01/10/2018

chẳng hiểu gì hết

Tao Không Ngu. viết 14:04 ngày 01/10/2018

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ên int 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 được int **p2 = &pb (thùng có thể chứa được cốc).

Nguyễn Phú Thành viết 14:01 ngày 01/10/2018

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 *’

Tao Không Ngu. viết 14:01 ngày 01/10/2018

Hi Nguyễn Phú Thành.

  1. Có bạn có thể ép kiểu như bình thường. int *p = (int *)pb.
  2. Tuy nhiên bạn phải hiểu mình là gì trước.

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ự.

Nguyễn Phú Thành viết 14:08 ngày 01/10/2018

đã é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ự CCCCCCC

rogp10 viết 14:04 ngày 01/10/2018

a = *&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).

Nguyễn Phú Thành viết 13:58 ngày 01/10/2018

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.

Tao Không Ngu. viết 14:01 ngày 01/10/2018

Hi Nguyễn Phú Thành.

  1. a=*(&b) Không nhầm thì nó là a = b.
  2. Bạn cần chú ý kiểu dữ liệu.

P/S Có vẻ bạn chưa hiểu lắm về con trỏ.

Nguyễn Phú Thành viết 14:07 ngày 01/10/2018

đ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.

rogp10 viết 14:09 ngày 01/10/2018

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;

Nguyễn Phú Thành viết 14:09 ngày 01/10/2018

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ế.

Bài liên quan
0