2011-07-19 43 views
38

Kích thước của con trỏ có giống với kích thước như loại trỏ tới hoặc con trỏ luôn có kích thước cố định không? Ví dụ:Kích thước của con trỏ là gì?

int x = 10; 
int * xPtr = &x; 
char y = 'a'; 
char * yPtr = &y; 

std::cout << sizeof(x) << "\n"; 
std::cout << sizeof(xPtr) << "\n"; 
std::cout << sizeof(y) << "\n"; 
std::cout << sizeof(yPtr) << "\n"; 

Sản lượng này sẽ là gì? Liệu sizeof(xPtr) trả về 4 và sizeof(yPtr) trả về 1, hoặc liệu 2 con trỏ có thực sự trở lại cùng kích thước không? Lý do tôi hỏi điều này là do các con trỏ đang lưu trữ một địa chỉ bộ nhớ và không phải là các giá trị của các địa chỉ được lưu trữ tương ứng của chúng.

Trả lời

55

Con trỏ thường có kích thước cố định, ví dụ: trên thực thi 32 bit, chúng thường là 32 bit. Có một số ngoại lệ, như trên các cửa sổ 16 bit cũ khi bạn phải phân biệt giữa các con trỏ 32 bit và 16 bit ... Nó thường khá an toàn khi cho rằng chúng sẽ đồng nhất trong một tệp thực thi nhất định trên hệ điều hành máy tính để bàn hiện đại .

Chỉnh sửa: Mặc dù vậy, tôi sẽ hết sức thận trọng khi đưa ra giả thiết này trong mã của bạn. Nếu bạn định viết một cái gì đó hoàn toàn phải có một con trỏ có kích thước nhất định, bạn nên kiểm tra nó!

Con trỏ hàm là một câu chuyện khác - xem Jens' answer để biết thêm thông tin.

+5

không đúng sự thật, thậm chí trên cùng một kích thước con trỏ máy có thể khác nhau – 4pie0

+2

@ cf16 Họ có thể, nhưng câu trả lời của tôi chỉ khẳng định rằng đối với hiện đại của hệ điều hành máy tính để bàn, tức là Win32/64, Linux ... Bạn có thể cho tôi một ví dụ về nó khác với một trong những hệ thống đó? Ví dụ: –

+0

bạn đã đề cập đến một số trường hợp ngoại lệ, nhưng OK – 4pie0

10

Trên con trỏ kích thước máy 32 bit của con số là 32 bit (4 byte), trong khi trên máy 64 bit là 8 byte. Bất kể họ đang trỏ đến kiểu dữ liệu nào, họ đều có kích thước cố định.

+1

có vấn đề gì? câu hỏi đã được hỏi cho các con trỏ kiểu dữ liệu ... – peeyush

+1

Điều gì về một thực thi 32 bit trên một máy 64 bit? – Ident

0

Kích thước của một con trỏ là kích thước theo yêu cầu của hệ thống của bạn để giữ một địa chỉ bộ nhớ độc đáo (vì một con trỏ chỉ giữ địa chỉ nó trỏ tới)

+0

Ngoại trừ khi trỏ đến những thứ như một char trên một máy xử lý văn bản. –

54

Chức năng Con trỏ có thể có kích thước rất khác nhau, từ 4 tới 20 Byte trên máy X86, tùy thuộc vào trình biên dịch. Vì vậy, câu trả lời là KHÔNG - kích thước có thể thay đổi.

Ví dụ khác: lấy chương trình 8051, có ba dải bộ nhớ và do đó có ba kích thước con trỏ khác nhau, từ 8 bit, 16bit, 24 bit, tùy thuộc vào vị trí của mục tiêu, mặc dù kích thước của mục tiêu luôn giống nhau (ví dụ: char).

+2

Cảm ơn bạn, tôi thậm chí không nghĩ đến việc xem xét các con trỏ chức năng. – MGZero

+1

Điều này chỉ áp dụng nếu bạn đang xem hội đồng. Trong C++, các kích thước khác nhau được ẩn khỏi chế độ xem của bạn. – Jay

+2

@Jay: Không đúng chút nào. 'sizeof (p)' có thể cho kết quả khác nhau cho các loại con trỏ khác nhau. – Nemo

6

Để trả lời câu hỏi khác của bạn. Kích thước của một con trỏ và kích thước của con trỏ trỏ đến không liên quan. Một sự tương tự tốt là xem xét chúng như các địa chỉ bưu điện. Kích thước của địa chỉ của một ngôi nhà không có mối quan hệ với kích thước của ngôi nhà.

+1

Nhưng các mã zip có thể có kích thước khác nhau ở các khu vực khác nhau, Xem [Tất cả các con trỏ dữ liệu có cùng kích thước] (http://stackoverflow.com/questions/1241205/are-all-data-pointers-of-the-same -size-in-one-platform). Có một số mối quan hệ trong đó con trỏ đến các loại khác nhau có thể có kích thước khác nhau. –

+1

Nếu bạn nhìn vào CPU, có nhiều loại phương pháp địa chỉ khác nhau (phụ thuộc vào bộ xử lý). Mã hóa nhỏ nhất địa chỉ liên quan đến nơi mà lệnh thay vì đưa ra một địa chỉ tuyệt đối. Một số có liên quan đến một thanh ghi CPU. Chúng lớn hơn một chút so với loại đầu tiên (nếu bạn bao gồm thanh ghi). Lớn nhất có một địa chỉ tuyệt đối. Đây thường là lớn nhất vì chúng cần phải có đủ bit để mã hóa toàn bộ không gian địa chỉ của bộ xử lý. C và C++ ẩn các chi tiết này khỏi bạn. Bạn sử dụng các địa chỉ tuyệt đối và trình biên dịch xác định cách nó có thể nhận được những gì bạn muốn. – Jay

7

Con trỏ không phải lúc nào cũng có cùng kích thước trên cùng một kiến ​​trúc.

Bạn có thể đọc thêm về khái niệm "gần", "xa" và "khổng lồ" gợi ý, cũng giống như một ví dụ về một trường hợp kích thước con trỏ khác nhau ...

http://en.wikipedia.org/wiki/Intel_Memory_Model#Pointer_sizes

2

Họ có thể khác nhau trên các máy có thể định địa chỉ từ (ví dụ, các hệ thống PVP của Cray).

Hầu hết các máy tính hiện nay là các máy có thể định địa chỉ byte, trong đó mỗi địa chỉ đề cập đến một byte bộ nhớ. Ở đó, tất cả các con trỏ dữ liệu thường có cùng kích thước, cụ thể là kích thước của địa chỉ máy.

Trên các máy có khả năng từ, mỗi địa chỉ máy chỉ thay thế cho một từ lớn hơn một byte. Trên đó, một con trỏ (char *) hoặc (void *) đến một byte bộ nhớ phải chứa cả một địa chỉ word cộng với một byte bù đắp trong từ được thêm vào.

http://docs.cray.com/books/004-2179-001/html-004-2179-001/rvc5mrwh.html

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