C語言基礎之指標運算

2021-10-07 02:44:34 字數 3223 閱讀 2010

指標的加法

#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 意義不相同,前者沒有...