兩道題題引發的思考

2022-08-05 05:24:17 字數 2498 閱讀 7271

下週的討論課又到我講**了,這幾天都在看**、準備ppt,選了一篇好難的**啊,看了這麼久了,還是不夠清晰。。。所以決定先換下思路,做點題。

下面的**輸出是什麼

void

add(int *p)

add(p);

}int main()

分析這個題目看起來還是比較友好的。首先我們來分析一下add()函式。其實看名字就能知道它是在做加法啦,不要更明顯好嗎=。=

這個函式沒有返回值,函式引數是乙個int型的指標,函式體中首先對指標p指向的內容做自增操作,然後列印出自增後的值,接著判斷自增後的值與5的關係,如果大於5,則返回。

接下來看看main函式在幹啥。main中首先宣告了乙個int型的變數i,並初始化為0,然後把i的位址傳入add函式中。

最後看看函式的執行過程:

第一步:i = 0,執行add(0),則*p = 0,執行(*p)++後,*p = 1,因此列印出1, 此時 *p >5不成立,因此執行add(1)

第二步:add(1), 則 *p = 1, 執行(*p )++後,*p = 2,因此列印出2, 此時 *p >5不成立,因此執行add(2)

。。。第五步:add(4), 則 *p = 4, 執行(*p)++後,*p = 5,因此列印出5,此時 *p >5仍然不成立,因此執行add(5)

第六步:add(5),則 *p = 5, 執行(*p)++後,*p = 6,因此列印出6, 此時 *p >5成立,因此函式返回

所以最後的輸出是:123456,執行截圖如下:

下面的**輸出是什麼

int main()

; int *p=(int *)(&a+1);

printf("%d",*(p-1));

system("pause");

return

0;}

這個題目看起來就不如第一題那麼容易了。在沒有執行**之前,我是這麼理解的:&a就是陣列的首位址,也就是a[0]的位址,那麼&a+1應該就是a[1]

的位址了,也就是說p指向a[1]

,最後輸出*(p-1),那麼應該輸出的是a[0],結果應該是1。竟然已經分析到這了,那我們先看看結果吧:

突然有種被打臉了的感覺。。。這和我預期的不太一樣啊。為什麼會這樣呢?

為了更好的理解這個結果,我們將上述**進行拆分,並把中間結果也輸出來觀察

從輸出中可以看出,&a和&a[0]是同乙個位址,而&a+1是&a上進行了偏移。為了計算這個偏移量,我手動用計算器計算了兩個位址之間的偏移量,得出的結果是14。到這裡的時候我直接懵了,14是個什麼鬼?從**冒出來的?為啥不是4?就算不是4,那也應該是4的倍數的吧?這個14真的是讓我困擾了好久。一開始我以為是自己在計算器上輸入錯了,但是測試了幾遍,都是這個結果。然後我真的好懵。。師兄過來說,你用的是十六進製制啊。。。那十六進製制的14不就是20麼,20?不就剛好是陣列的大小麼?這個時候似乎有些豁然開朗了。。

事實上,儘管&a和&a[0]是相同的,但本質上是有所區別的,a是乙個陣列起始位址,而a[0]只是資料第乙個元素的位址,&a+1是在&a的基礎上偏移了「乙個單位」,而這「乙個單位」,是a指向的內容佔的空間,也就是整個陣列的空間,因此這個時候&a+1並不是指向a[1]

, 而是下圖中紫色的位置。因此很容易看出*(p-1) = 5.

而&a[0]+1是在a[0]的基礎上偏移「乙個單位」,此時的「乙個單位」是以a[0]為參考的,因此是4個位元組。

我們可以再新增幾句列印語句:

看到上圖中的結果了嗎?對於第一句,a是乙個單位,因此&a+1只比&a多了1

而第二句中,我們把這個單位轉換為int *了,a資料裡面有幾個整型資料呢?當然是5啦

對於第三句,把單位轉換成char *,那麼乙個包含5個整型的陣列的大小自然是20了,這時的單位就是位元組了

把陣列型別改成double也是一樣的道理,只是最後一句話列印的結果是40。換成char陣列也是相似的,只是要注意char陣列中,預設最後乙個字元是\0。

又是關於指標的,看來是該找個時間總結一下指標的一些常見用法了,今天先到這裡了,滾去看**了。。

益智題 (簡單的兩道題)

a公司拍攝的 黃河頌 獲最佳故事獎 b公司的 孫悟空 獲最佳武術獎 c公司的 白娘子 獲最佳戲劇獎。a公司的經理說 我們三經理的姓分別是三部片名的第乙個字,而又同自己所拍 首字不一樣。另一公司的孫經理笑著說 真是這樣 那三經理各姓什麼?答案 a白 b黃 c孫 另一公司的孫經理 說明a不姓孫,而a又不...

兩道選擇題

教授面帶微笑,走進教室,對我們說 我受一家機構委託,來做一項問卷調查,請同學們幫個忙。一聽這話,教室裡輕微的一陣議論開了,大學課堂本來枯燥,這下好玩多了。問卷表發下來,一看,只有兩道題。第一題 他很愛她。她細細的瓜子臉,彎彎的娥眉,面色白皙,美麗動人。可是有一天,她不幸遇上了車禍,痊癒後,臉上留下幾...

兩道選擇題

記得大學一堂選修課上。教授面帶微笑,走進教室,對我們說 我受一家機構委託,來做一項問卷調查,請同學們幫個忙。一聽這話,教室裡輕微的一陣議論開了,大學課堂本來枯燥,這下好玩多了。問卷表發下來,一看,只有兩道題。第一題 他很愛她。她細細的瓜子臉,彎彎的娥眉,面色白皙,美麗動人。可是有一天,她不幸遇上了車...