以下內容**:
感覺對自己有用,收藏了。如果**,請註明如上出處。多謝!
看到一篇關於c語言指標的文章,正好最近在看《c和指標》就去看了一下。《一道 c 語言指標訪存題目的引申》,裡面的第乙個題目就把我難住了。
幫助123456789 #include int main() ; int *pa = (int)(&a) + 1; printf("%x\n", *pa); return 0; }
正確的輸出結果應該是 2000000.自詡對c指標還比較了解,不就是儲存記憶體位址的變數嗎?有什麼難的,後來才發現我錯了。我想的是&a,是對陣列名字去位址,那出來的結果不就是儲存a的位址,那這樣給他轉換成int變數之後再加1,然後再賦值給乙個int*指標是會出錯的,結果我編譯了一下,真的出錯了:
error: invalid conversion from `int' to `int*'.
無法將int值賦值給int *指標變數,我修改了一下,在(int)(&a) + 1;前面加上了乙個強制型別轉換 (int *),編譯之後輸出結果:
我以為正確了,雖然他說正確答案是 2000000。後來我又仔細看了一下源**,發現 int *pa = (int *)(int)(&a) + 1; 這句**是先將 &a 轉換成指標再在其基礎加 1。而原來的意思是先給 &a 加 1再轉換成指標,結果我再修改了一下**:int *pa = (int *)((int)(&a) + 1); 這樣結果竟然正確了,輸出2000000:
這時候我完全朦了,這是怎麼回事?後來我將 &a 和 a作為整數輸出,想看看它到底是什麼,結果發現
幫助12 printf("%d\n",&a); printf("%d\n",a);
他們的輸出結果是一樣的,也就是說a 和 &a 的值一樣,我以為問題到這裡就解決了,但是我還是不能理解為什麼會輸出 2000000.於是我到網上去搜尋了一下資料,結果搜到了 對陣列名取位址是什麼? 。裡面說
「幫助123 1 int array[100]; 3 memset(array, 0, sizeof(array)); 4 memset(&array, 0, sizeof(array));
第3行和第4行有什麼不同嗎?其實從效果上來說是一樣的,但是這裡要注意 array 和 &array 的型別是不同的。array 相當於 &array[0],而 &array 是乙個指向 int[100] 的指標,型別是 int(*)[100]。」
總算知道了a和&a的差別,但是我還是不明白為什麼它會輸出 2000000,這到底是為什麼呢?
我試著修改了一下**:
int a = ;
這樣之後的輸出結果成了 : 5000000 原來和陣列a的第二個元素有關係。哈哈,有點懂了,經過我n次的試驗。
首先我們的**是:
幫助123 int a = ; int *pa = (int *)((int)(&a) + 1); printf("%x\n", *(pa));
我這邊編譯的結果 a[0]也就是a代表的位址是 0x22ff70 a[1] 的位址是 0x22ff74 。我檢視了一下記憶體(使用printf看的),記憶體裡的資料是這樣的:
幫助12 0x22ff70 0x22ff71 ... 0x22ff74 ... 0x22ff77 01 00 ... 02 ... 00
而且我們知道訪問記憶體中的資料是高位元組的位址是高位,低位元組的位址是低位。也就是說如果我的位址是 0x22ff70,以這個位址訪問乙個整數,得到的整數就是73,72,71,70的資料排列 即00000001(以前學過一點彙編,加上自己試驗了一下,就出來的 :),也就是1。如果訪問0x22ff74 也就是 00000002 是2.如果訪問 0x22ff71 也就是從74開始 02000000。這不就是我們的正確答案 2000000 。
問題解決!寫得比較亂,勿怪。若有錯誤,歡迎指正!
C 陣列名與指標
1.緣起 由乙個題目引起的 問下面 輸出的是什麼?const char psz hello world int iarr cout sizeof psz endl cout sizeof iarr endl 前者輸出是4,輸出的是psz的型別大小,即指標型別佔4個位元組 在win32下 後者輸出是2...
C 陣列名與指標
陣列名a代表乙個固定的位址,內涵在於其指代實體是陣列這種資料結構,可以理解為指標常量,但不是指標常量!比如sizeof a 等於5,而sizeof 指標 等於4 另外陣列名a不能用作左值 形參陣列名b是指標變數,在函式fun中可以用作左值。陣列名a作右值時,a代表陣列首元素的位址,而 a代表整個陣列...
C C C語言陣列名與指標
int array 10 int p 然後令 p array include int main int p array for int i 0 i 10 i printf n for int i 0 i 10 i printf n for int i 0 i 10 i printf n for in...