指標的加法
#define _crt_secure_no_warnings
#include int main()
; //宣告乙個char型別的陣列
char* p = ac; //指標p為char*型別
printf("p = %p\n", p);
printf("p + 1 = %p\n", p + 1); //輸出指標p+1的結果
int ai = ; //宣告乙個int型別的陣列
int* q = ai; //指標q為int*型別
printf("q = %p\n", q);
printf("q + 1 = %p\n", q + 1); //輸出指標q+1的結果
printf("sizeof(char) = %d\n", sizeof(char)); //sizeof(char)的結果
printf("sizeof(int) = %d\n", sizeof(int)); //sizeof(int)的結果
return 0;
}
這就讓我們聯想到之前的陣列的下標問題,指標和陣列是存在密不可分的聯絡,可通過以下**進行理解:
#define _crt_secure_no_warnings
#include int main()
; int len = 4;
char* p = ac;
int tag = 1; //標誌位
for (int i = 0; i < len; i++) }
if (tag == 1)
else
return 0;
}
上面的這段**迴圈,檢查了指標的加法的確是按照sizeof(char)進行的。
【總結】
▲ 給乙個指標加1表示要讓指標指向下乙個變數
int a[10];
int* p = a;
int i;
*(p + i) a[i]
▲ 如果指標不是指向一片連續分配的空間,如陣列,則這種運算沒有意義
▲ 這些算術運算可以對指標做:
◆ 給指標加、減乙個整數(+、+=、-、-=)
◆ 遞增遞減(++/--)
◆ 兩個指標相減
以上結果,說明兩個指標相減得到的結果是兩個指標所指向的位址的差再除以sizeof(elemtype),告知你的是這兩個位址之間有多少個elemtype型別的資料。
*p++
▲ 取出p所指的那個資料來,完事之後順便把p移到下乙個位置去
▲ *的優先順序雖然高,但是沒有++高
▲ 常用於陣列類的連續空間操作
▲ 在某些cpu上,這可以直接被翻譯成一條彙編指令
▲ 在某些cpu上,這可以直接被翻譯成一條彙編指令
→這種組合運算經常用於迴圈遍歷,比如:
#define _crt_secure_no_warnings
#include int main()
; int ai = ;
printf("第一種列印:\n"); //第一種:使用int i迴圈進行遍歷
for (int i = 0; i < sizeof(ac) / sizeof(ac[0]); i++)
printf("\n第二種列印:\n"); //第二種:使用int* p迴圈進行遍歷
for (char* p = ac; p < ac + sizeof(ac) / sizeof(ac[0]);)
return 0;
}
指標比較▲ , >=, !=都可以對指標做
▲ 比較它們在記憶體中的位址
▲ 陣列中的單元的位址肯定是線性遞增的
0位址
▲ 當然你的記憶體中有0位址,但是0位址通常是個不能隨便碰的位址
▲ 所以你的指標不應該具有0值
◆返回的指標是無效的
◆指標沒有被真正初始化(先初始化為0)
▲ null是乙個預定義的符號,表示0位址
◆ 有的編譯器不願意你用0來表示0位址
指標的型別
▲ 無論指向什麼型別,所有的指標的大小都是一樣的,因為都是位址
▲ 但是指向不同型別的指標是不能直接互相賦值的
▲ 這是為了避免用錯指標,考慮以下程式:
#define _crt_secure_no_warnings
#include int main()
在編譯後顯示了error:錯誤(活動) e0513 不能將 "char *" 型別的值分配到 "int *" 型別的實體
指標的型別轉換
▲ void* 表示不知道指向什麼東西的指標
◆ 計算時與char* 相同(但不相通)
▲ 指標也可以轉換型別
int* p = &i;
void* q = (void*)p;
▲ 這裡並沒有改變p所指的變數的型別,而是讓後人用不同的眼光通過p看它所指的變數
◆ 我不再當你是int啦,我認為你就是個void!
用指標來做什麼
▲ 需要傳入較大的資料時用作引數
▲ 傳入陣列後對陣列做操作
▲ 函式返回不止乙個結果
◆ 需要用函式來修改不止乙個變數
▲ 動態申請記憶體
C語言基礎之運算
1 算術運算 1 2 整數相除,取整數部分。11 5 商2,餘1 和 不能對整數0進行操作,否則會中斷程式。但是得到的結果是inf,表示無窮大。不能對浮點數使用。向零取整 取更接近0的數字 的結果與其左運算元的符號保持一致。2 賦值運算 1 將賦值運算子右邊的值賦給左邊的變數。int a a 5 將...
C語言基礎之指標
一 指標 1 指標就是存放位址的變數。乙個指標變數占用4個位元組。int pa int pa 2 指標型別 取位址 解引用 1 指標型別 int pa pa,pa int pa int pa 語義 pa是乙個指標,該指標指向乙個int型的資料,即pa存放乙個int型資料的位址。int pa,pb p...
C語言 指標運算
p a 將變數位址賦值給指標 p array 將陣列位址賦值給指標 p array i 將陣列元素賦值給指標 p1 p2 將指標位址賦值給指標 include 引用函式庫 void main f0889414 f0889414 f0889414 10 10 10 p 1 和 p 意義不相同,前者沒有...