2010-02-03 9 views
8

Có thể là tôi đang xem cái gì đó hiển nhiên, nhưng đâu là siêu dữ liệu con trỏ được lưu trữ? Ví dụ nếu tôi có một con trỏ int 32 bit ptr và tôi thực hiện ptr++ nó biết để tăng 4 byte trong bộ nhớ. Tuy nhiên, nếu tôi có một con trỏ int 64-bit, nó biết để tăng 8 byte. Vì vậy, những người theo dõi loại con trỏ ptr là gì và nó được lưu ở đâu? Để đơn giản, bạn có thể giới hạn điều này thành C++.Siêu dữ liệu con trỏ được lưu trữ ở đâu?

+8

Câu trả lời ngắn: ma thuật. Câu trả lời dài, nó không cần phải được lưu trữ bất cứ nơi nào, bởi vì trình biên dịch có thể làm số học con trỏ được yêu cầu tại thời gian biên dịch. –

+0

Alok, bạn nên đăng bài đó như một câu trả lời. Thật xuất sắc. –

+0

Từ câu hỏi thường gặp * 'Không có câu hỏi nào là quá nhỏ hoặc quá "newbie".' *, Do đó, thẻ [n00b] là không cần thiết và trong mọi trường hợp, lỗi chính tả. – dmckee

Trả lời

18

Nó không được lưu trữ ở mọi nơi, mỗi lần. Trình biên dịch xem xét kiểu của ptr và biến hoạt động ++ thành số gia tăng của số byte đúng.

+0

Cảm ơn. Tôi thậm chí không nghĩ rằng nó có thể được tính toán tại thời gian biên dịch. – bmalicoat

7

Trong symbol table trong khi trình biên dịch chạy. Không có nơi nào trong khi chương trình chạy của bạn, hoặc đúng hơn là chương trình ngầm ẩn trong mã cấp thấp hơn do trình biên dịch tạo ra.

2

Nó không được lưu trữ ở bất cứ nơi nào, nó được xác định tại thời gian biên dịch. Thực tế, lấy mã này làm ví dụ:

int *abc = NULL; 
cout << abc + 1; /* Prints sizeof(int) */ 
cout << (void *)((char *)abc + 1); /* Prints 1. Casting it back to void * is necessary, 
      otherwise it will try to dereference it and print as a string. */