1+1 不等於2? 來看這道奇怪的C語言題目

對於不少C語言初學者來講,指針是一大難題!面試

可是指針也是c語言的靈魂,離開指針,可能c語言就只能處理小學數學題了。數組

最後,若是你們若是在自學遇到困難,想找一個C++的學習環境,能夠加入咱們的C++學習圈,點擊我加入吧,會節約不少時間,減小不少在學習中遇到的難題。學習

圖片描述

可是指針雖然難,但並無難到大多數人學不會的程度。C語言面向的使用羣體是普通人,而不是智商超羣的大佬們。只要用心學習,確定是能夠掌握的。spa

1+1 不等於2? 來看這道奇怪的C語言題目指針

今天小編又給你們帶來一道關於指針的c語言面試題,話很少說上代碼:圖片

include<stdio.h>

int main()
{
int vector2 = {
{1,2,3,4,5,6,7,8,9,10},
{11,12,13,14,15,16,17,18,19,20}
};
int(*a)[10] = vector;
printf("%d %d %d %d %d
",
a, (a + 1), (a + 1), (a[0] + 1), (a[1]));
return 0;
}ip

程序首先定義了一個二維數組vector,並使用初始化的方式賦予了1-20的初值。內存

接着又定義了一個指針a,並令其指向vector。get

接下來程序經過指針依次輸出5個值。數學

那麼,這個c語言程序的輸出是什麼呢?

初步分析

顯然這題的關鍵點在於指針a

首先咱們要明確一點:在理解指針的時候,要像int char short同樣,將它當作一種數據類型。

分析a的定義語句:int(*a)[10] = vector,能夠發現a實際上是一個 int[10] 類型的數組指針。

那麼這個c語言的程序輸出結果是什麼呢,獲得答案最簡單粗暴的方式就是直接運行代碼:

1+1 不等於2? 來看這道奇怪的C語言題目

clipboard.png

c語言中的指針移動

不單單是c語言,語言中的數據類型其實就是告訴處理器應該如何訪問它,這句話是什麼意思呢?請看下圖:
圖片描述

1+1 不等於2? 來看這道奇怪的C語言題目

你們都知道數據在內存中的最小粒度是一個字節,上圖假設截取內存中的10個字節,在個人電腦上,c語言類型佔用了4個字節,所以int類型指針是逐4個字節訪問內存的。

同理,short類型的指針是逐2個字節移動的。char類型的指針是逐字節的移動的。

到這裏相信你們都發現了,指針的加減法並不像數學概念中的加減同樣嚴格遵循 1+1 =2。

對於int型指針來講,+1 竟然移動了4個字節,對於short型指針來講 +1又只移動了兩個字節。

其實分析指針加減法的時候不該該從只從數學角度考慮,好比 1千克 + 1克 也不等於2對吧!

這提醒了咱們應該不單單考慮數字,還須要考慮單位。

指針的單位就是數據類型。int型指針的單位就是sizeof(int),short型指針的單位就是sizeof(short),這樣考慮是否是以爲合理多了。

程序輸出分析

明確了指針的加減法處理方式,再來分析程序輸出就簡單多了。

a, (a + 1), (a + 1), (a[0] + 1), (a[1]))

1 11 2 2 11

咱們首先查看一下指針的數據類型(下圖截取自vs2019)。

圖片描述

1+1 不等於2? 來看這道奇怪的C語言題目

從上圖中咱們能夠清楚地看到a的數據類型就是一個int[10]的數組指針。

那麼a的數據類型就是一個int[10]的數組,顯然a就等價於(*a+0)

那不就是數組的第0個元素1了嗎。

**(a+1)不就至關於指針指向位置的第0個元素嗎,也就是11。

再來看第三個,a的數據類型就是一個int[10]的數組,那麼a+1就至關於移動到這個數組的第1個元素(下標從0開始),也就是2。

第四個數字分析和第三個是相似的,由於 *a等價於a[0],因此此處輸出也是2。

第五個數字的分析和第四個是相似的,由於 *(a+1)和a[1]是等價的,輸出爲11。

相關文章
相關標籤/搜索