C語言 陣列名與指標

2021-06-21 01:38:37 字數 1879 閱讀 3878

以下內容**: 

感覺對自己有用,收藏了。如果**,請註明如上出處。多謝!

看到一篇關於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...