C語言中的指標專欄

2021-09-22 21:58:13 字數 2863 閱讀 1991

指標是什麼

我們可以把宿舍樓裡面的每乙個同學看成乙個個的變數,存放在乙個個宿舍裡,而為了方便找到每個同學,我們給每個宿舍標號,而指標就是每個宿舍的門牌號,它的值直接指向位址所對應的變數單元。

為什麼要有指標

很明顯我們找到乙個個同學最快的方式就是通過宿舍門牌號,指標就是為了能找到以它為位址的記憶體單元。

總結:指標就是位址,指標變數就是變數,用來存放位址的變數(存放在指標裡的值都會被當成位址來處理)。注意:乙個int型變數佔四個位元組,每個位元組都有乙個位址,指標變數存放的是第乙個位址。

**說明:

#incude int main()

那麼在這段**裡,a的位址就是存放在變數p中的,p就是乙個指標變數。

指標的大小

指標的大小在32位平台上 是4個位元組,在64位平台上是8個位元組。

指標的解引用

指標就是它指向的目標

int main()

總結:指標的型別決定對指標解引用的許可權。char的指標解引用就只能訪問乙個位元組,而int的指標能訪問四個位元組。

指標±整數

一句話:指標±1是±其所指元素的型別大小。所以多級指標±1都是±4個位元組,因為其所指型別都是指標。

下面來看一段**:

#include#includeint main()

這裡一共列印了五個變數,1、2、4不做過多解釋,我們看到3和5都出現了指標+1,不同的是,3裡pc指向的變數型別是char 型別,所以pc+1只+乙個位元組。而5裡pi指向的變數型別是int 型,所以pi+1就+4個位元組。

列印結果如下:

指標±指標

代表兩個指標之間所經歷的的元素個數

舉乙個例子:

int my_point(int a[10])

很明顯,這裡指標p指向的是下標為0的第乙個元素,q指向下標為9的第十個元素,所以q-p就是指標q和指標p之間所經歷8的元素個數,為9.

同樣,指標之間的運算還可以用來求字串長度:

int my_strlen(char *a)

return p-a;

}

前面我們談及的都是一級指標,我們知道指標變數也是變數,是變數就有位址,就可以被存放,二級指標就是用來存放指標的位址。

如上圖所示,a的位址存放在pa中,pa的位址存放在ppa中,ppa就是乙個二級指標。

二級指標解引用

*ppa就是訪問pa。

int b=20;

*ppa=&b;//等價於 pa=&b

**ppa=30;

//等價於*pa=30;

//等價於a=30;

指標和陣列本身是沒有聯絡的。陣列名的概念我們先看一段**。

由此可見,陣列名和陣列首元素的位址是一樣的。陣列名表示的就是陣列首元素的位址。

int arr[20]=;

int *p=arr;

在這裡p存放的是首元素的位址。那麼我們可以使用指標來訪問乙個陣列。

很明顯,&arr[i]和p+i結果是一樣的。所以p+i其實計算的是陣列的arr下標為i的位址。

那麼我們現在直接通過指標來訪問陣列:

#include#includeint main()

; int *p = arr;

int sz = sizeof(arr) / sizeof(arr[0]);

int i = 0;

for (i = 0; i < sz; i++)

system("pause");

return 0;

}

沒有懸念,列印效果如下:

C 語言中的指標

指標是 c 語言中的精華,正確靈活的運用指標,可以表示複雜的資料結構,動態分配記憶體,方便使用字串和陣列,呼叫函式返回多結果,直接處理記憶體單元等等。位址就是記憶體的編號,如果拿旅店作為記憶體,那麼每個房間號其實就相當於位址了。當程式編譯時,就會對變數分配記憶體單元,分配時按變數型別分配大小。經過編...

C語言中的指標

隨著程式語言的越來越多,但c語言在程式語言中的地位似乎始終沒有改變,其中得益於c語言中的指標,可以直接去操作記憶體位址與暫存器,執行效率也高,在嵌入式領域運用得尤其廣泛。對於初學者來說指標是c語言中很難翻越的一座大山,指標的掌握程度直接關係到c語言的掌握程度,其實指標並不是那麼高不可攀,只是紙老虎而...

C語言中的指標

指標是c語言中非常重要的東西,書本上寫了好多來解釋裡面的原理,當年老師也跟我們講了好多這方面的東西,一直就是感覺沒有聽明白。直到我看到了指向指標的指標,我建立了自己的理解,不知道是否正確,但是基本能解決遇到的問題。int p p i p。type p,宣告指標變數,type 例如int 告訴計算機p...