
基本概念
指標代表記憶體地址,
通常在型別關鍵字的后面加字符*來表示指標,表示指標指向什么型別的值,比如,char*表示一個指向字符的指標,float*表示一個指向float型別值的指標,
指標指向的可能還是指標,這時要用兩個星號**表示,
int** foo;
指標變數初始化
宣告指標變數之后,編譯器會為指標變數分配一個記憶體空間,但是這個記憶體空間里面的值是隨機的,
因此,指標變數宣告后,必須先讓它指向一個分配好的地址,然后再進行讀寫,這叫做指標變數的初始化,
int* p;
int i;
p = &i;
為了防止讀寫未初始化的指標變數,可以將未初始化的指標變數設為NULL,
int* p = NULL;
指標運算子
* 運算子
*號除了表示指標以外,還可以作為運算子,用來取出記憶體地址里面的值,
void increment(int* p) {
*p = *p + 1;
}
*p表示指標p指向的值,對*p賦值,會改變指標所指向的地址里面的值,
& 運算子
&運算子用來取出變數所在的記憶體地址,
int x = 1;
printf("x's address is %p\n", &x); // %p是記憶體地址的占位符
&運算子與*運算子互為逆運算,
int i = 5;
if (i == *(&i)) // 正確
指標運算
指標本質上是一個無符號整數,代表了記憶體地址,它可以進行運算,但是規則并不是整數的規則,
- 指標與整數值的加減運算
指標與整數值的運算,表示指標的移動,
short* j;
j = (short*)0x1234;
j = j + 1; // 0x1236
上面示例中,j是一個指標,指向記憶體地址0x1234,你可能以為j + 1等于0x1235,但正確答案是0x1236,原因是j + 1表示指標向記憶體地址的高位移動一個單位,而一個單位的short型別占據兩個位元組的寬度,所以相當于向高位移動兩個位元組,同樣的,j - 1得到的結果是0x1232,
指標移動的單位,與指標指向的資料型別有關,資料型別占據多少個位元組,每單位就移動多少個位元組,
- 指標與指標的加法運算
雖然指標本質上是一個無符號整數,但是指標只能與整數值進行加減運算,兩個指標進行加法是非法的,
- 指標與指標的減法
相同型別的指標允許進行減法運算,回傳它們之間的距離,即相隔多少個資料單位,
高位地址減去低位地址,回傳的是正值;低位地址減去高位地址,回傳的是負值,
減法回傳的值屬于ptrdiff_t型別,這是一個帶符號的整數型別別名,具體型別根據系統不同而不同,這個型別的原型定義在頭檔案stddef.h里面,
short* j1;
short* j2;
j1 = (short*)0x1234;
j2 = (short*)0x1236;
ptrdiff_t dist = j2 - j1;
printf("%d\n", dist); // 1
- 指標與指標的比較運算
指標之間的比較運算,比較的是各自的記憶體地址哪一個更大,回傳值是整數1(true)或0(false),
參考: C 語言教程
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/497681.html
標籤:C
上一篇:IOS OpenGL ES 影像擴展邊緣彩色模糊 GPUImageRGBDilationFilter
下一篇:nginx原始碼層面探究request_time、upstream_response_time、upstream_connect_time與upstream_header_time指標具體含義
