剖析数组名、函数名(不是指针常量,更不是指针)
? ? ? ? 對(duì)于一個(gè)數(shù)組,如 int a[4];? 如果只是給出數(shù)組名a,編譯器不知道該取該數(shù)組的第幾個(gè)元素,因此編譯器不會(huì)自動(dòng)取值,而是返回該數(shù)組的首地址(第一個(gè)元素的地址)。其實(shí),數(shù)組名a就是數(shù)組本身,并不是數(shù)組的首地址,只是當(dāng)只是給出了數(shù)組名a的時(shí)候,而又同時(shí)需要取值時(shí),數(shù)組名a才會(huì)被隱式轉(zhuǎn)換為該數(shù)組的首地址。因此,int *p=&a;和int *p=a的效果是一樣的,只是前者是顯示的,而后者是隱式的。
? ? ? ? 例如,數(shù)組名a在以下情況就不是數(shù)組的首地址的:1.sizeof(a)? 得到的結(jié)果為16,即a是一個(gè)數(shù)據(jù)類型,長(zhǎng)度為4的int數(shù)組類型,是數(shù)組本身,沒(méi)有進(jìn)行隱式轉(zhuǎn)換;2.&a? ?表示數(shù)組的首地址,并不是指針的指針,而是指向長(zhǎng)度為4的int數(shù)組的指針,一個(gè)常量指針,其指針類型為: in (*)[4],此處4不能省略,因?yàn)?#34;指向不確定長(zhǎng)度的指針" 是沒(méi)有意義的,編譯器若不知道該指針指向的類型,就無(wú)法編譯指針的加減法運(yùn)算(指針指向類型的長(zhǎng)度未知,加減法的位移量就未知)。int (*p)[4]=&a; 定義一個(gè)指針p,并初始化為數(shù)組a的地址,等價(jià)于:int *p=a;? 3. C++中取引用時(shí)a也不是指針。
char* test2() {char p[] = "hello world";return p; } //錯(cuò)誤代碼char* test2() {char *p = "hello world";return p; }? ? ? ? 對(duì)于以上代碼,char p[ ] = "hello world";與char *p?= "hello world";是有著本質(zhì)區(qū)別的,前者首先定義了一個(gè)數(shù)組p,且用后面的字符串初始化該數(shù)組p,數(shù)組p的作用域?yàn)樵摵瘮?shù)內(nèi)部,數(shù)組生存期和作用域與聲明方式相關(guān)。而且該數(shù)組沒(méi)有 const 資格符,字符串內(nèi)容是可以修改的。這個(gè)數(shù)組首地址不能在函數(shù)中返回(因?yàn)楹瘮?shù)結(jié)束的同時(shí),p已經(jīng)被銷毀了),除非聲明用了 static 。對(duì)于后者,聲明一個(gè)指針。字符串字面量本身成為一個(gè)靜態(tài)存儲(chǔ)期的數(shù)組,它再隱式轉(zhuǎn)換成指針以初始化聲明的指針。這個(gè)字符串是不可修改的(修改會(huì)導(dǎo)致未定義行為,數(shù)組本身可放在只讀內(nèi)存區(qū))。它的首地址可以在函數(shù)中返回。
? ? ? ? 對(duì)于函數(shù)名,其原理與上面基本相同。函數(shù)名其實(shí)并不是函數(shù)的入口地址,只是被隱式轉(zhuǎn)換了。函數(shù)名只是函數(shù)本身。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的剖析数组名、函数名(不是指针常量,更不是指针)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MiniLED显示屏和普通显示屏哪个好用
- 下一篇: gcc的警告提示信息