對於這個問題的愚蠢,我很抱歉。但是我找不到理解這個結果的方式。我試圖弄清楚C++中的指針究竟是什麼。以下是以不同方式打印地址的簡單代碼。C++中的指針地址
int a = 15000;
char *b = reinterpret_cast<char*>(a); //equivalent of char *b = (char *)a
int *m = &a;
//(1)
printf("&a:%p\n",&a); //0x7fff5fbff878
printf("&*m:%p\n",&*m); //0x7fff5fbff878
printf("m:%p\n",m); //0x7fff5fbff878
//(2)
printf("a:%p\n",(int*)a); //0x3a98
printf("&*b:%p\n",&*b); //0x3a98
printf("b:%p\n",b); //0x3a98
printf("*m:%p\n",(int*)*m); //0x3a98
printf("&b:%p\n",&b); //0x7fff5fbff870
printf("&m:%p\n",&m); //0x7fff5fbff868
//(3)
std::cout << "b:" << b << std::endl; //error: Segmentation fault: 11
所以,問題是
- 爲什麼的地址(1)和(2)是不同的
- 爲什麼的(1)和(2)是大小(地址的長度)不同
- 當一個int被強制轉換爲一個char *
- 如何 'b' 可能含有 'A'
- 爲什麼錯誤(3)已同時「發生的printf地址(「b發生了什麼事:%p \ n 「,b)」正在工作。
提示:0x3a98 == 15000 – Michael
接受道歉。如果(2)int被轉換爲指針。這是合法的,但不保證在任意的情況下有意義。在(3)的情況下,你嘗試使用這個假指針,就好像它指向了字符數組(C字符串) - 但它沒有。 – ddbug
該死的,非常感謝不要指責:P –