C語言指標與陣列的區別 1 extern

2021-06-05 16:50:43 字數 1859 閱讀 4626

近日閱讀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 修飾的是陣...