青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

extern數組與extern指針

數組名代表了存放該數組的那塊內存,它是這塊內存的首地址。這就說明了數組名是一個地址,而且,還是一個不可修改的常量,完整地說,就是一個地址常量。數組名跟枚舉常量一樣,都屬于符號常量。數組名這個符號,就代表了那塊內存的首地址。注意了!不是數組名這個符號的值是那塊內存的首地址,而是數組名這個符號本身就代表了首地址這個地址值,它就是這個地址。這就是數組名屬于符號常量的意義所在。由于數組名是一種符號常量,它是一個右值,而指針,作為變量,卻是一個左值,一個右值永遠都不是左值,那么,數組名永遠都不會是指針!

對于這段話我是這么理解的:數組名在經過編譯之后將變成一個數值,這個數值就是該數組的首地址。由于數組名是一個地址,那么把它賦給一個指針變量也就不足為奇了。

例如有定義

char a[14];

char * p;

char * q;

void foo(char * pt)

{

};

考慮以下幾種賦值:

p=a;//合法,將一個地址賦給一個指針變量;

q=p;//合法,將一個指針變量的值賦給另一個指針變量;

a=p;//非法,a是數組名即地址,不是一個變量,不可被賦值(也就是上文中說的"數組名是右值"

再看這幾種調用:

foo(a);//將一個地址作為參數傳入函數,函數中用一個指針變量接收這個地址值

foo(p);//將一個指針變量的值傳入函數(也是一個地址),函數中用一個指針變量接收這個地址

 

可以看出許多時候數組名和指針可以等同地看待,而c也把它們看作是兼容的類型對待,這就是為什么我那個錯誤的聲明不被編譯器在語法檢查的時候“喀嚓”的原因。

 

關于extern的作用,許多地方都有說明,例如可以在c++里進行c格式函數的聲明,可以聲明一個變量或函數是外部變量或外部函數;我們這里要討論的是外部變量的聲明。被extern修飾的全局變量不被分配空間,而是在連接的時候到別的文件中通過查找索引定位該全局變量的地址。

 

有了這些基礎后,我們現在正式開始研究extern 數組和extern 指針的問題:

 

首先在一個.c文件中有如下定義:

char a[]={1,2,3,4};

分析:這是一個數組變量的定義,編譯器將為這個數組分配4字節的空間,并且建立一個索引,把這個數組名、數組類型和它被分配的空間首地址對應起來。它被編譯之后生成一個中間文件

然后我們在另一個.c文件中分別以不同的形式進行聲明:

(1) extern char a[];

分析:這是一個外部變量的聲明,它聲明了一個名為a的字符數組,編譯器看到這個聲明就知道不必為這個變量分配空間,這個.c文件中所有對數組a的引用都化為一個不包含類型的標號,具體地址的定位留給連接器完成。編譯完成之后也得到一個中間文件,連接器遍歷這個文件,發現有未經定位的標號,于是它搜索其他中間文件,試圖尋找到一個匹配的空間地址,在此例中無疑連接器將成功地尋找到這個地址并將此中間文件中所有的這個標號替換為連接器所尋找到的地址,最終生成的可執行文件中,所有曾經的標號都應當已經被替換為地址。這是一個正常工作過程,連接出來的可執行文件至少在對于該數組的引用部分將工作得很好。

(2) extern char * a;

分析:這是一個外部變量的聲明,它聲明了一個名為a的字符指針,編譯器看到這個聲明就知道不必為這個指針變量分配空間,這個.c文件中所有對指針a的引用都化為一個不包含類型的標號,具體地址的定位留給連接器完成。編譯完成之后仍然得到一個中間文件,連接器遍歷這個文件,發現有未經定位的標號,于是它搜索其他中間文件,試圖尋找到一個匹配的空間地址,經過一番搜索,找到了一個分配過空間的名為a的地方(也就是我們先定義的那個字符數組),連接器并不知道它們的類型,僅僅是發現它們的名字一樣,就認為應該把extern聲明的標號連接到數組a的首地址上,因此連接器把指針a對應的標號替換為數組a的首地址。這里問題就出現了:由于在這個文件中聲明的a是一個指針變量而不是數組,連接器的行為實際上是把指針a自身的地址定位到了另一個.c文件中定義的數組首地址之上,而不是我們所希望的把數組的首地址賦予指針a(這很容易理解:指針變量也需要占用空間,如果說把數組的首地址賦給了指針a,那么指針a本身在哪里存放呢?)。這就是癥結所在了。所以此例中指針a的內容實際上變成了數組a首地址開始的4字節表示的地址(如果在16位機上,就是2字節)。本例中指針a的初值將會是0x0a090807little endian),顯然不是我們的期望值,所以運行會出錯也就理所應當了。

?

幾點細節:我們發現,使用extern修飾的變量在連接的時候只找尋同名的標號,不檢查類型,例如如果我們定義的甚至不是一個變量而是一個全局的函數,比如去掉定義

char a[]={....};

代之以

void a(){};

連接器居然也會連接通過。

實例如下:

比如在a.c文件中有這樣一段代碼

 

int g_i[] = {1, 2, 3, 4};

extern void testdotp();

 

void main(void)

{

   int i = 0;

   int num = 0;

   num = sizeof(g_i) / sizeof(int);

   for (i = 0; i < num; i++)

   {

      printf("g_i[%d] = %d ", i, g_i[i]);

   }

   printf("\n");

   testdotp();

}

 

而在b.c中的代碼如下:

extern int *g_i;

 

void testdotp()

{

   printf("*(&g_i + 2) = %d\n", *(&g_i + 2));

   printf("&g_i = %d\n", &g_i);

   printf("&g_i + 1= %d\n", &g_i + 1);

   printf("g_i = %d\n", g_i);

   printf("g_i + 1 = %d\n", g_i + 1);

}

運行結果為

g_i[0] = 1 g_i[1] = 2 g_i[2] = 3 g_i[3] = 4

*(&g_i + 2) = 3

&g_i = 4344368

&g_i + 1= 4344372

g_i = 1

g_i + 1 = 5

 

分析如下:

因為b.c文件中g_i變量的地址是a.c文件中g_i數組的首地址,故g_i的值為g_i[0]的值,&g_i的值為g_i地址的首地址。

 

*(&g_i + 2)的值:&g_i的值為g_i數組的首地址,(&g_i + 2)就為數組g_i3個元素的地址,*(&g_i + 2)就為第2個元素的值,即3

 

&g_i + 1:由于&g_i的值為g_i數組首地址,由于在32位機上運行,故&g_i + 1&g_i基礎上加上4個字節

g_i + 1:由于g_i是一個指針變量,g_i變量內存放的是地址,又因為g_i的值為1,而g_i + 1就為1 + 4的單元的內存空間(32位機上),故g_i + 15

 

posted on 2009-11-17 10:53 肥仔 閱讀(2067) 評論(0)  編輯 收藏 引用 所屬分類: C++ 基礎

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲高清视频在线| 欧美不卡福利| 久久久久久久久久久成人| 亚洲欧美高清| 欧美一区二区精美| 欧美一区二区黄色| 久久国产精品99国产精| 久久久蜜桃一区二区人| 久久综合狠狠综合久久综合88 | 久久久一本精品99久久精品66| 亚洲欧美日产图| 欧美一级理论片| 久久综合九色综合网站| 欧美福利一区二区| 国产精品入口夜色视频大尺度| 国产精品香蕉在线观看| 一区二区三区在线观看欧美| 91久久久亚洲精品| 99视频精品全部免费在线| 亚洲一区二区在线看| 久久人人爽爽爽人久久久| 亚洲国产第一页| 亚洲人午夜精品免费| 午夜精彩视频在线观看不卡| 久久精品一二三区| 欧美丝袜一区二区三区| 狠狠色狠狠色综合| 亚洲系列中文字幕| 欧美成人黄色小视频| 亚洲一区二区毛片| 久久一区视频| 国产精品综合久久久| 91久久久精品| 久久精品免视看| av成人激情| 久久久久久久久久看片| 国产精品自在线| 亚洲综合清纯丝袜自拍| 亚洲国产免费看| 久久精品国产视频| 欧美特黄a级高清免费大片a级| 国内揄拍国内精品久久| 亚洲免费在线视频| 亚洲卡通欧美制服中文| 牛牛国产精品| 91久久中文| 在线亚洲精品| 亚洲国产欧美在线人成| 久久久久久久综合日本| 国产精品国产馆在线真实露脸| 亚洲欧洲在线免费| 欧美xart系列高清| 久久久久青草大香线综合精品| 国产嫩草影院久久久久 | 国产精品免费福利| 在线视频日本亚洲性| 亚洲电影免费观看高清| 久久影视精品| 在线观看国产精品网站| 久久精品一区二区三区四区| 国产精品99久久久久久久vr| 欧美色欧美亚洲另类二区| 在线一区二区日韩| 亚洲日本中文字幕区| 欧美日韩精品伦理作品在线免费观看| 亚洲精品一区二区三区不| 亚洲电影免费观看高清完整版在线观看 | 麻豆精品精华液| 欧美在线视频不卡| 国产最新精品精品你懂的| 久久国产精品免费一区| 久久成人精品一区二区三区| 国产午夜精品理论片a级大结局| 久久久久国产精品麻豆ai换脸| 久久gogo国模裸体人体| 91久久精品国产91性色tv| 亚洲日韩中文字幕在线播放| 欧美日韩直播| 久久精品国产2020观看福利| 久久久久久久精| 99亚洲一区二区| 亚洲女爱视频在线| 在线观看日韩专区| 亚洲人精品午夜| 国产欧美日韩免费| 欧美电影美腿模特1979在线看| 欧美激情久久久| 亚洲图片激情小说| 性欧美videos另类喷潮| 在线观看亚洲a| 亚洲精品一二区| 国产精品拍天天在线| 久久久成人网| 欧美激情在线播放| 久久久久国产免费免费| 欧美精品videossex性护士| 性做久久久久久| 毛片基地黄久久久久久天堂| 99在线精品视频在线观看| 欧美怡红院视频| 亚洲一区二区在线| 欧美日本中文字幕| 亚洲伊人伊色伊影伊综合网| 欧美影院在线播放| 99精品久久久| 亚洲激情视频在线观看| 国产精品久久午夜| 美女黄毛**国产精品啪啪| 亚洲午夜av电影| 欧美成人午夜77777| 中文精品一区二区三区| 亚洲国产高清自拍| 国产视频久久| 国产精品久久久久久久久免费樱桃 | 亚洲色诱最新| 欧美电影在线观看| 久久riav二区三区| 一区二区三区色| 亚洲伊人观看| 午夜精品区一区二区三| 性欧美暴力猛交69hd| 午夜精品福利电影| 性欧美在线看片a免费观看| 久久岛国电影| 亚洲美女在线看| 亚洲一区二区三区四区在线观看| 中文网丁香综合网| 欧美影院在线播放| 免费不卡在线视频| 国产精品久久久久久久久久久久久久 | 欧美jizzhd精品欧美喷水 | 国产精品国产精品国产专区不蜜| 久久精品一区中文字幕| 久久久噜噜噜久噜久久 | 国产精品白丝av嫩草影院| 国产精品亚洲美女av网站| 国产日韩欧美成人| 亚洲精品网址在线观看| 久久天堂av综合合色| 国产精品家庭影院| aa国产精品| 亚洲狠狠婷婷| 久久精品三级| 激情91久久| 蜜桃av久久久亚洲精品| 亚洲欧美美女| 国产日韩欧美二区| 久久精品国产一区二区三| 亚洲一级黄色片| 久久久青草婷婷精品综合日韩| 亚洲免费高清视频| 欧美日韩视频在线一区二区| 亚洲国产综合在线看不卡| 亚洲国产成人久久综合| 欧美高清视频一区| 亚洲三级毛片| 一本在线高清不卡dvd| 欧美另类高清视频在线| 亚洲视频高清| 欧美一区二区三区免费大片| 国内精品免费午夜毛片| 久久综合国产精品| 欧美激情二区三区| 欧美一区激情| 欧美激情一区二区三区四区| 久久亚洲图片| 亚洲精品一区二| 亚洲五月六月| 一区二区亚洲精品| 亚洲国产欧美在线| 国产精品一区二区你懂的| 欧美在线精品免播放器视频| 欧美极品影院| 欧美中文在线观看国产| 久久综合五月| 久久国产一区| 欧美天天在线| 美女网站久久| 国产最新精品精品你懂的| 欧美好吊妞视频| 国产日韩欧美不卡| 亚洲免费视频成人| 午夜在线视频观看日韩17c| 女人香蕉久久**毛片精品| 久久久久久婷| 国产在线高清精品| 久久精品国产欧美激情| 小处雏高清一区二区三区| 国产精品中文字幕欧美| 亚洲三级影院| 亚洲三级免费观看| 欧美日韩调教| 一区二区欧美在线| 欧美一级久久久| 国产一区999| 久久综合久久综合这里只有精品| 久久不射电影网| 激情综合色综合久久综合| 老司机午夜精品视频| 欧美成人一区二免费视频软件|