C语言中“数组名”和“数组名”
C語言中 數(shù)組名 和 &數(shù)組名
== 實(shí)驗(yàn)環(huán)境 ==
1. 編譯器:gcc 5.4.0
2. 操作系統(tǒng):Ubuntu 16.04 x86_64
緣起
本以為此知識(shí)點(diǎn)我已熟練掌握,可是最近應(yīng)用的時(shí)候還真給記混淆了。所以寫篇文章加深印象。
Show me the code
廢話少說,show me the code.
#include <stdio.h>int main(void) {int array[5] = {0};printf("1. array = %p\n", array); printf("2. &array = %p\n", &array); printf("3. &array[0] = %p\n", &array[0]); printf("4. array + 1 = %p\n", array + 1);printf("5. &array[0] + 1 = %p\n", &array[0] + 1);printf("6. &array + 1 = %p\n", &array + 1);printf("7. sizeof(array) = %lu\n", sizeof(array)); return 0; }請(qǐng)你思考一分鐘,然后再看答案。
…
…
運(yùn)行結(jié)果是:
討論
在絕大多數(shù)關(guān)于數(shù)組的表達(dá)式中,數(shù)組名代表指針常量,這個(gè)指針指向數(shù)組首個(gè)元素。從數(shù)值上講,數(shù)組名表示的值就是首個(gè)元素的地址。 從結(jié)果的第1行和第3行,第4行和第5行,都可以驗(yàn)證這一點(diǎn),即array的值就等于&array[0]的值。
剛才已經(jīng)說過,數(shù)組名代表指針常量,且這個(gè)指針指向數(shù)組首個(gè)元素。當(dāng)對(duì)這個(gè)指針進(jìn)行加減的時(shí)候,以一個(gè)數(shù)組元素為顆粒度。例子中的數(shù)組元素為整型,所以數(shù)組名加1時(shí)地址加4. 對(duì)比第4行和第1行,可以驗(yàn)證。
但是,在以下2種語境中,數(shù)組名并不是上面說的指針常量。
1. sizeof(數(shù)組名)
2. &數(shù)組名
對(duì)于1,sizeof(數(shù)組名)返回整個(gè)數(shù)組的長度,而不是指針常量的長度。 結(jié)果的第7行,返回20(=4*5),而不是返回8(因?yàn)榈刂穼挾仁?4位,所以指針占8字節(jié))。
對(duì)于2,對(duì)數(shù)組名取地址所產(chǎn)生的值的類型是一個(gè)指向整個(gè)數(shù)組的指針,而不是一個(gè)指向指針常量的指針。所以&array的類型是指向整個(gè)數(shù)組的指針,而array是指向array[0]的指針,雖然在數(shù)值上相同(結(jié)果的第1行和第2行),但是在類型上不同。
正因?yàn)樗鼈兊念愋筒煌?#xff0c;所以在加1或減1的時(shí)候,顆粒度不同。array以一個(gè)數(shù)組元素為顆粒度,例子中的數(shù)組元素為整數(shù),所以array加1時(shí)地址加4(對(duì)比結(jié)果的1、4兩行);而&array以整個(gè)數(shù)組為顆粒度,例子中的數(shù)組為有5個(gè)元素的整型數(shù)組,所以&array加1時(shí),地址加20(對(duì)比結(jié)果的2、6兩行)。
總結(jié)
絕大多數(shù)情況下,數(shù)組名代表指針常量,這個(gè)指針常量指向數(shù)組首個(gè)元素。從數(shù)值上講,數(shù)組名的值就是首個(gè)元素的地址。當(dāng)對(duì)這個(gè)指針常量進(jìn)行加減的時(shí)候,以一個(gè)數(shù)組元素為顆粒度。
在 sizeof(數(shù)組名) 和 &數(shù)組名 這2種語境中,數(shù)組名并不是上面說的指針常量。 sizeof(數(shù)組名)返回整個(gè)數(shù)組的長度,而不是指針常量的長度。&數(shù)組名 的類型是一個(gè)指向整個(gè)數(shù)組的指針,而不是一個(gè)指向指針常量的指針。
參考資料
https://blog.csdn.net/wangkeyen/article/details/50650000
總結(jié)
以上是生活随笔為你收集整理的C语言中“数组名”和“数组名”的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在 C 中引用汇编语言定义的 .glob
- 下一篇: 浅谈优先队列