指標是什麼
我們可以把宿舍樓裡面的每乙個同學看成乙個個的變數,存放在乙個個宿舍裡,而為了方便找到每個同學,我們給每個宿舍標號,而指標就是每個宿舍的門牌號,它的值直接指向位址所對應的變數單元。
為什麼要有指標
很明顯我們找到乙個個同學最快的方式就是通過宿舍門牌號,指標就是為了能找到以它為位址的記憶體單元。
總結:指標就是位址,指標變數就是變數,用來存放位址的變數(存放在指標裡的值都會被當成位址來處理)。注意:乙個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...