2011-05-18 44 views
5

Tôi đang học c bằng cách đọc K & R và thực hiện các bài tập. Tôi hiện đang ở chương 5 đề cập đến con trỏ. Tôi không hiểu tại sao các tuyên bố:Thay vào đó int * p có nên dài * p không?

int *p; 

không phải là:

long int *p; 

từ * p chứa địa chỉ và không có gì bảo đảm rằng một biến kiểu int sẽ đủ lớn để chứa một địa chỉ lớn. Hay là có?

Trả lời

8

int là loại đối tượng mà con trỏ trỏ tới và không phải là kích thước của con trỏ. Kích thước của con trỏ là độc lập của đối tượng nó trỏ tới

Ví dụ:

int *p; 

double *d; 

Cả pointers p và d sẽ "bình thường" có kích thước tương tự, nhưng các dữ liệu mà chúng trỏ tới don' t có cùng kích thước.

Chỉnh sửa: Như được chỉ ra trong các con trỏ nhận xét không thực sự là "bắt buộc" có cùng kích thước.

Như John giải thích:

Ví dụ, một char * trên một hệ thống soạn thảo văn bản giải quyết thực sự có thể lớn hơn một int *, vì nó cần phải chỉ định một bù đắp vào từ đó. Bên nhận bảo lãnh chỉ là rằng void * và char * có cùng một sự liên kết và đại diện, mà con trỏ đến các loại tương thích có cùng liên kết và đại diện, rằng con trỏ đến struct loại có cùng liên kết và đại diện, và con trỏ với các loại công đoàn đều có cùng liên kết và đại diện

+2

Con trỏ tới 'double' và' int' không cần phải có cùng kích thước. –

+1

@Carl hmm, tôi nghĩ rằng họ nên. Không phải là kích thước của một con trỏ nhất quán trên một hệ thống nhất định? – Pepe

+0

Thx Peter. Tôi đoán trình biên dịch biết làm thế nào lớn để làm cho * p dựa trên các tùy chọn trình biên dịch. – grok12

1

int * không thuộc loại int. Nó là một kiểu con trỏ. Do đó nó sẽ đủ lớn để lưu trữ bất kỳ địa chỉ nào. long int * có cùng kích thước với int * - chỉ là bạn đang xử lý nơi mọi thứ được chỉ ra là khác nhau.

3

long int * có nghĩa là một điểm đến một long int.
Nó không có nghĩa là một con trỏ dài.

Con trỏ là những thứ riêng biệt và sẽ có kích thước riêng. (phụ thuộc vào độ bit mà bạn đang biên soạn)

1

Đây là con trỏ tới một int (tôi có xu hướng viết là 'int * p'). Điều này về cơ bản có nghĩa là p là một con trỏ đến một int.

Thứ hai là một con trỏ đến một int dài.

Cả hai đều là con trỏ và do đó cùng một số byte lưu trữ, nhưng một tham chiếu đến một int, một cái khác là một int dài.

0

Đừng nhầm lẫn loại con trỏ với loại nội dung trỏ đến.Loại biểu thức *pint, nhưng loại pint *.

Các vấn đề liên quan