一道90%都会做错的指针题
今天,在我們的一個(gè)小群里,一個(gè)同學(xué)發(fā)了一道題目給我看,這道題目應(yīng)該是C語(yǔ)言面試的一股清流了,各種招聘筆試上都可以看到,我試著發(fā)到我的大群里去,發(fā)現(xiàn)有人對(duì)這個(gè)理解不是很深刻,所以再發(fā)出來(lái),知識(shí)總是在不斷的碰撞中提高的,同理,球技也是一樣。
大家可以先猜測(cè)一下這兩個(gè)程序的輸出是什么?
什么是指針?
書籍看得比較多了,這個(gè)指針那個(gè)指針,但是我認(rèn)為如果說(shuō)到指針,不說(shuō)變量,就有點(diǎn)耍流氓,所以我認(rèn)為理解指針的基礎(chǔ)就要理解它是一個(gè)變量,所以指針,可以理解為指針變量,再延伸出來(lái),就是地址變量,可以存地址的一個(gè)變量,而且存的這個(gè)地址指向的類型也是有要求的。
#include "stdio.h" int main() { int i = 12; int *p = &i; printf("%d\n",sizeof(int *)); printf("%d\n",sizeof(p)); printf("%p\n",&p); }看上面的代碼,p是一個(gè)指針變量,p存的是一個(gè)地址,p存的這個(gè)地址存的類型是 int 類型。有點(diǎn)拗口,我們畫個(gè)圖。
上圖中 我們定義了一個(gè)變量 p ,所以編譯器就必須要給這個(gè)p分配內(nèi)存,如上圖所示,這個(gè)p的內(nèi)存是 0x1000,p是什么類型呢?從定義可以看,p的類型是 int *,所以說(shuō)p只可以存 int * 類型的值,也就是一級(jí)指針,就是一級(jí)地址,也就是 i 的地址。
i 也是一個(gè)變量,這個(gè)變量的地址是 0x1001, 這個(gè)地址上存的值是 12。
地址本來(lái)是沒(méi)有名字的,因?yàn)槎x了變量,所以地址就對(duì)應(yīng)有了一個(gè)別名,這個(gè)名字就代表了這個(gè)內(nèi)存地址。
弱弱問(wèn)一句,聲明有沒(méi)有分配內(nèi)存呢?
什么是數(shù)組?
我覺(jué)得指針和數(shù)組是不用比較的,我們比較的是指針變量和數(shù)組名,這兩個(gè)東西才有比較的意義,數(shù)組是一類數(shù)據(jù)的集合,指針變量只能是一個(gè)地址變量,沒(méi)必要折騰自己的大腦了。
#include "stdio.h" int main() { int array[5] = {1,2,3,4,5}; return (0); }我們定義了一個(gè) array的數(shù)組,這個(gè)數(shù)組是個(gè)什么鬼東西,我們知道,內(nèi)存可以起一個(gè)別名,數(shù)組是連續(xù)幾個(gè)同類型內(nèi)存塊的別名。
好了,我們?cè)僬f(shuō)下一個(gè)問(wèn)題 ,array 是數(shù)組的名字,&array 獲取的是這個(gè)數(shù)組的地址,而且這個(gè)地址的值等于 &array[0] 「首元素的地址」。
雖然數(shù)值相等,但是他們的含義是不一樣的。
如果 &array +1 這個(gè)時(shí)候,地址偏移的是 &array + sizeof(array)
如果 &array[0] +1 這個(gè)地址偏移是 &array[0] + sizeof(array[0]) ,也就是偏移到地址 &array[1]上。
再看看上面的兩個(gè)題目
我們?cè)倏纯瓷厦娴念}目
int *p = (int*)(&a +1);這句代碼執(zhí)行后,p的值應(yīng)該是 &a +sizeof(a)了。
但是下面這句代碼就不一樣了。
#include "stdio.h" int main() { int a[5] = {1,2,3,4,5}; int *p = &a; int *q = a; printf("%d %d\n",*(q+1),*(p+1)); return (0); }&a 賦值給 p 后,這個(gè)意義就不一樣了,這時(shí)候,它的類型是 int* ,p+1 就是 p + sizeof(int *) 。只能偏移到數(shù)組的下一個(gè)位置。
所以這樣說(shuō)之后,大家都知道上面的輸出結(jié)果了嗎?
2,5
2,2
掃碼或長(zhǎng)按關(guān)注
回復(fù)「?加群?」進(jìn)入技術(shù)群聊
總結(jié)
以上是生活随笔為你收集整理的一道90%都会做错的指针题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑常用快捷键和操作你值得拥有!
- 下一篇: rk3188开机失败(ump_file_