C语言中, 有些时候数值名并不与指针等价.
生活随笔
收集整理的這篇文章主要介紹了
C语言中, 有些时候数值名并不与指针等价.
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
以前已經(jīng)都提過了, c語言中,數(shù)組名就是1個指向數(shù)組第1個元素地址的指針.
?????????? 如數(shù)組char a[] = "bcd";
?????????? 數(shù)組名a 就是指向數(shù)組a[]的第1個元素a[0]的地址
?????????? 所以*a==a[0]=='b'
????????? 當我們定義1個新的指針p,并給它賦值時:
?????????? p=a;
?????????? 一般來講我們認為他們p與a是等價的
????????? 因為同樣有: *p==p[0]='b'
????????? p[i]=a[i]
??? 但是有特殊情況, 要將數(shù)組名a看成1個特殊的指針.
???????? 例如函數(shù)sizeof , 這是取1個對象(變量or常量) 的內(nèi)存占用空間
? ??????? 舉個例子:
? ? ? ? ? 定個1個字符數(shù)組c:
????????? char c[]="abcdefghikjlmn";
???????? 那么sizeof(c) 得出的是數(shù)組c的所占內(nèi)存空間,也就是c所有元素占的長度(包括最后的隱藏元素'\000').
???????? 所以
???????? sizeof(c) == 15 ? //因為c是字符數(shù)組, 每1個字符占的長度是1字節(jié)(byte)啦
???????? 跟著定義1個指針p,并賦值:
???????? p=c;
????????
???????? 而size(p) 是求p本身所占的內(nèi)存空間, 也就是1個內(nèi)存單位
? ? ? ?? sizeof(p) == 8? // 64位gcc, 32位gcc是4, 因為對于每1個內(nèi)存單位來講,64位的內(nèi)存單位長度是32位的一倍.
???????? 那么數(shù)組c 是不是容易都是特殊指針呢. 不是, 當他作為1個參數(shù)被傳入時, 系統(tǒng)會將這個參數(shù)轉(zhuǎn)為一般化指針:
?
???????? 例如我定義1個新函數(shù):
???????? long int getlen(char* a){
?????????????? return sizeof(a);
???????? }
???????? 執(zhí)行 getlen(c) 時, 實際是也會執(zhí)行size(c), 但是因為這時數(shù)組名c作為參數(shù)已經(jīng)被轉(zhuǎn)為一般的函數(shù), 所以getlen函數(shù)里面的sizeof(c)求的是c指針本身所占的內(nèi)存空間, 也就是8啦.
見如下例子:
輸出:
?
下面這個是相同代碼在32位gcc環(huán)境下的輸出:
?
?????????? 如數(shù)組char a[] = "bcd";
?????????? 數(shù)組名a 就是指向數(shù)組a[]的第1個元素a[0]的地址
?????????? 所以*a==a[0]=='b'
????????? 當我們定義1個新的指針p,并給它賦值時:
?????????? p=a;
?????????? 一般來講我們認為他們p與a是等價的
????????? 因為同樣有: *p==p[0]='b'
????????? p[i]=a[i]
??? 但是有特殊情況, 要將數(shù)組名a看成1個特殊的指針.
???????? 例如函數(shù)sizeof , 這是取1個對象(變量or常量) 的內(nèi)存占用空間
? ??????? 舉個例子:
? ? ? ? ? 定個1個字符數(shù)組c:
????????? char c[]="abcdefghikjlmn";
???????? 那么sizeof(c) 得出的是數(shù)組c的所占內(nèi)存空間,也就是c所有元素占的長度(包括最后的隱藏元素'\000').
???????? 所以
???????? sizeof(c) == 15 ? //因為c是字符數(shù)組, 每1個字符占的長度是1字節(jié)(byte)啦
???????? 跟著定義1個指針p,并賦值:
???????? p=c;
????????
???????? 而size(p) 是求p本身所占的內(nèi)存空間, 也就是1個內(nèi)存單位
? ? ? ?? sizeof(p) == 8? // 64位gcc, 32位gcc是4, 因為對于每1個內(nèi)存單位來講,64位的內(nèi)存單位長度是32位的一倍.
???????? 那么數(shù)組c 是不是容易都是特殊指針呢. 不是, 當他作為1個參數(shù)被傳入時, 系統(tǒng)會將這個參數(shù)轉(zhuǎn)為一般化指針:
?
???????? 例如我定義1個新函數(shù):
???????? long int getlen(char* a){
?????????????? return sizeof(a);
???????? }
???????? 執(zhí)行 getlen(c) 時, 實際是也會執(zhí)行size(c), 但是因為這時數(shù)組名c作為參數(shù)已經(jīng)被轉(zhuǎn)為一般的函數(shù), 所以getlen函數(shù)里面的sizeof(c)求的是c指針本身所占的內(nèi)存空間, 也就是8啦.
見如下例子:
輸出:
?
下面這個是相同代碼在32位gcc環(huán)境下的輸出:
?
總結(jié)
以上是生活随笔為你收集整理的C语言中, 有些时候数值名并不与指针等价.的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C 语言里的字符串---字符数组
- 下一篇: 详解为什么32位系统只能用4G内存.