近日閱讀c專家程式設計,對c語言中的指標陣列的區別有了新的認識。
先看一段**:
int a = ;
void hello()
#includeextern void hello();
extern int *a;
int main(void)
上面的**的輸出為
d.c 134520856
: 3第一行**是第乙個檔案d.c輸出了int a;a的內容
第二行**是第二個檔案hello.c輸出了extern int *a;指標a的內容
gcc編譯的時候,在鏈結階段了,hello.o有extern a符號,在d.o中找到,所以extern a 和d.o的a是同乙個符號(我認為稱他們「指向相同」有歧義)
也可以用影象表示
第乙個檔案d.c將a當成陣列來處理,可以按照想象的進行輸出,但是
但是第二個檔案是把符號a當成指標來操作的(因為 extern int *a), 指標所在的位址是134520856,但是指標的值是3
如果去掉注釋之後,則會報錯,因為在main函式中,按照編譯器的規矩,a[1]可以被我們這樣認為 *(a+1);
因為a等於3,a+1等於4,*(a+1)的意思就是取記憶體位址為4的位元組內容,我不知道位址為4的那個位元組裡面是什麼東西。
再看下面**:
int *a;
void hello()
extern void hello();
extern int *a;
int main(void)
輸出結果:
d.c 161968136
: 161968136
我說了實際上 只要是extern a就表示這兩個a符號,實際上是同乙個符號a,(你可以將兩個檔案的函式輸出&a,就會發現他們的位址是一樣的)。
這種情況下的記憶體分配是這樣的。
最後再看乙個**:
int *a;void hello()
extern void hello();
extern int a;
int main(void)
輸出結果為:
d.c value:160223240
d.c address:134520864
hello.c value:134520864
hello.c address:134520864
hello.c a[1]
記憶體分布圖為:
在hello.c中,a被當成int a;
a的值為160223240, *(a+1),就能夠訪問到2.
總結:編譯器在編譯的時候左值會由編譯器分配位址,而右值執行時才能知道,當我們宣告乙個指標變數的時候,會首先為指標變數開闢乙個記憶體空間,
即指標位址是確定的,但是指標所指向的地方時在執行時才知道。如果使用指標引用定義陣列中的元素時,會將陣列元素的值解析成位址,就造成了
訪問錯誤
C語言 陣列指標與指標陣列區別
陣列指標 也稱行指標 int p n 優先及高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。int a 3 2 int p 2 p a p 該語句執行後,也就是p p 1,p跨過a 0 指向了a 1 所以...
C語言陣列與指標的區別
最近,把 c專家程式設計 這本書,看完,這本書確實是一本非常好的書,講述了很多c語言技巧。總之相當精彩。這裡,我把陣列與指標不能互換的地方總結一下。首先我們要明白什麼是宣告,什麼是定義。c語言中有且只有乙個定義,但是它可以有多個宣告 用extern 因為定義相當於分配了記憶體,而宣告只是說明變數並不...
C語言陣列指標和指標陣列的區別
對指標陣列和陣列指標的概念,相信很多c程式設計師都會混淆。下面通過兩個簡單的語句來分析一下二者之間的區別,示例 如下所示 int p1 5 int p2 5 首先,對於語句 intp1 5 因為 的優先順序要比 要高,所以 p1 先與 結合,構成乙個陣列的定義,陣列名為 p1,而 int 修飾的是陣...