C 語言語法難點回顧之 指標

2021-08-26 18:17:10 字數 1886 閱讀 3751

由於前一陣子在學python,對c語言接觸的比較少,有些基礎內容便有些遺忘,所以特地花些時間回顧一下c語言的基礎內容。c語言與其他很多語言最大的不同之一就是指標,這也是初學c語言中遇到的第乙個難以理解的語法!書本上有的基礎內容就不贅述了,下面的內容主要是一些個人的理解。

1>  指標的定義明確指出指標變數是一種專門用來存放位址的變數。 我們知道所有

的資料都是用特定的編碼規則以一串二進位制的數的形式存在記憶體中,比如乙個int型別

的資料,占有32個bit。計算機為了方便管理成千上萬的資料,把bit都編了號。當程

序中定義了乙個變數後, 在編譯時計算機會為這個變數分配記憶體單元,即該變數在記憶體

中有乙個位址段。在c語言中我們可以用乙個變數專門來存放另乙個變數的位址(通常是

首位址),即指標。

2> 陣列其實是一種特殊的指標。舉個例子來說,int a[5]; 在這裡定義了乙個5

個元素的整型的陣列,實際上在底層的實現中,是計算機分配了5 x 32 bit的記憶體給

程式, 陣列的名稱a, 記錄的就是這段記憶體的首位址( 是不是很眼熟,是的,a就是

乙個指標)。而 a [n], 也就是陣列的第n+1個元素,這裡的n其實是相對於首位址的

偏移量。那麼a [n] 也就可以表示為 *(a + n) 。

3> 指標的用途非常廣泛,指標可以指向基型別資料,可以指向陣列,還可以指向函

數。乙個函式在編譯時會被分配給乙個入口位址,函式指標就指向這個入口位址。

就是層出不窮莫名其妙的括號。在這裡,我有乙個小技巧,所有的括號,我們把它視為

乙個變數。比如說:int * p[n] 和 int (*p) [n] ,前者是指標陣列,它是乙個

元素為整型指標的陣列,後者才是陣列指標,它(即p)才是指向乙個陣列的指標。

在分辨時因為後者有乙個括號,所以我們 (*p) 這個部分當作乙個變數a ,那麼int

a[n] 是乙個整型陣列,而p又是指向陣列首位址a的指標,所以int (*p)[n]中這個p

就是指向乙個陣列首位址的指標。

那麼接下來進入重頭戲,分辨以下p的含義:

int p;          //p是乙個整型資料

int *p; //p是乙個指向整型資料的指標

int *p[1]; //注意,這裡沒有括號,所以int *是一部分,p[3]是另一部

//分,現在很明顯了,p是乙個含有三個元素的陣列,元素型別為

//整型指標

int (*p)[1]; //這裡有括號,把括號看作乙個變數,那麼就變成了int a[3],

//*p指向a, 顯然p是指向乙個有三個整型元素的陣列的指標

int p(int); //p是乙個引數為整型,返回值也是整型的函式

int *p(int); //沒有括號,因此int *是一部分, p(int)是另一部分。顯然

//,這是乙個引數為整型,返回值為整型指標的函式

int (*p)(int); //有括號,處理方法參上。p是指向乙個引數為整型,返回值為整

//型的函式的指標

int (*p[1])(int);//有括號。p是乙個函式指標陣列,這個陣列中每個元素指向有

//乙個整數型形參和整數型返回值的函式

int *(*p(int)); //有括號。把(*p(int))看作變數a,int * a是乙個整型指

//針,再把p(int)看作變數b, *b指向a,那麼b應該是指向一

//個整型指標的指標,p(int)是乙個函式,所以顯然,p是乙個

//返回值為整型指標的指標的函式。簡單來說,這是乙個函式聲

//明。

這一部分就複習到此,以上純屬個人理解,如有錯誤或者不足,還望各位能夠不吝賜教!

C語言語法

printf 01f n double 2 1 printf 02f n double 2 1 保留兩位小數 陣列賦值 include memset al,0,sizeof al 輸入浮點數 while scanf lf n eof 字串比較 include char a 11 1234567890...

C語言語法基礎考試

c語言語法基礎考試 第2輪 學員姓名 試卷說明 1 本試卷共 25題,部分來自 intel 微軟 ti等公司的面試題,其餘出自平時基礎課程。2 本試卷主要目的是考查對 c語言本身的理解程式,而非演算法測試。3 所有題目均需相關說明,yes no 型回答均不得分。4 從實際專案開發的角度回答問題,切忌...

c語言語法陷阱總結

學習c語言也有一段時間了,關於語法上的錯誤,現在基本上也沒犯過,不過,我還是想小結一下。運算優先順序的問題,其實在背乘法表,的時候就已經開始接觸了。那時候我們知道在加減乘除的混合運算中,先算乘除,再算加減,如果遇到括號,先算括號裡的內容,這就是優先順序問題。那麼在 c語言中,我們也有很多運算,有運算...