C C 指標型別難點筆記

2021-09-29 01:34:30 字數 3091 閱讀 4347

背景:我對c/c++指標型別的認識到目前仍停留在本科學習c語言的水平上,當時也只是在課堂上聽聽,沒有認真思考琢磨過,更沒有在實戰專案中用過該知識點,以至於對指標型別現在可以說是不會!網上有很多部落格介紹指標,但個人覺得,由於博主表述水平限制和知識點本身晦澀難懂,所以學習該部分知識點還是選擇權威教材最為合適。

我將譚浩強編著的《c++程式設計》中的指標部分研讀理解。只對部分易混淆,易遺忘的知識點在此做一記錄,方便日後檢視。該部分內容重在理解,不能去記憶。

1 定義指標變數

int *pointer_1,*pointer_2;

//定義指標變數 *pointer_1,*pointer_2

//注意:指標變數名是pointer_1,pointer_2,定義指標變數時在變數名前加* 只是表示該變數是指標變數

//開頭的int 表示指所定義的指標變數是指向整型資料的指標變數,或者說*pointer_1,*pointer_2中只能存放整形資料的位址,int就是指標變數的基型別

2 區分指標變數與指標

int *pointer_1, i=1;//定義基型別為int型的指標變數pointer_1 和 int型變數i

pointer_1 = &i;//讓指標變數pointer_1指向i,即將變數i 的位址賦值給pointer_1

cout << "*pointer_1 = " << *pointer_1 << endl;//輸出*pointer_1的值,1

(1)在定義乙個指標變數pointer_1的時候在前面加 * 只表示該變數是個指標變數;如int *pointer_1;

(2)指標變數pointer_1的值是 i 的位址 &i。注意:指標變數的值是位址,不能理解為指標變數是位址

(3)變數i的位址&i 就是變數i的指標。牢記「位址即指標」。

(4)定義完指標變數pointer_1之後,使用

3 指標作為函式引數

指標做函式引數的應用在yolov3原始碼中十分普遍。它的作用是將乙個變數的位址傳送給被呼叫函式的形參。

//定義乙個被呼叫的函式,形參為指標變數(指標作為函式引數)

void swap(int *p1,int *p2)

//定義主函式去呼叫上面的這個函式

int main()

呼叫函式swap(pointer_1,pointer_2)將a,b的位址傳給形參之後,

p1 = pointer_1 = &a, p2 = pointer_2 = &b

*p1 = a = 3, *p2 = b = 4

4  指標變數做函式引數接收陣列位址

即形參是個指標變數,實參是陣列位址

//定義乙個被呼叫函式,用指標變數做形參

void select_sort(int *p, int n)

//定義乙個主函式呼叫上述函式

int main()

select_sort(a,10);//函式呼叫,陣列名作實參,表示將陣列元素a[0]的位址傳給形參

return 0;

}

函式呼叫後,形參接收a[0]的位址,即 p = &a[0], *p = a[0]

5 指標函式——返回指標值的函式

乙個函式可以帶回(即被呼叫後返回)乙個int值、float值、char值等,也可以帶回指標型的資料,即帶回乙個位址。

//定義指標函式

int *a(int x,int y)//a 是函式名,int是型別

呼叫上面的指標函式後帶回的是乙個指向整形資料的指標(整形資料的位址)。

指標即位址!!!

6 指向指標的指標(也常被叫做二級指標)

6.1 要理解指向指標(資料)的指標,必須先理解指標陣列。

指標陣列的每個元素均為指標資料,即每個元素的值都是乙個位址。

char *name = ; //定義指標陣列
[ ]的運算級別比*高,所以name先與[ ]結合組合成陣列,name[ ]再與*結合組成*name[ ] 。

以上定義了指標陣列name,它有4個元素,初始值分別是字串「basic」, 「fortran」, 「c++」, 「basic」 的起始位址。

須注意這裡的初值是字串的起始位址,而不是字串本身!!!

指標陣列 

字串

name[0]  ——>  basic

name[1]  ——>  fortran

name[2]  ——>  c++

name[3]  ——>  python

6.2 指向指標的指標

char * *p; //定義指向指標資料的指標變數,與 char *(*p)寫法等價
char * *p是常見寫法,為便於理解,將其視為char *( *p)寫法。

課本分析過程:先分析 char * p, 顯然是定義p為指向字元型資料的指標變數。然後在(*p)的前面又加了乙個 * 號,成了 char * (*p), 表示p指向的是字元指標

資料,*p 就代表p所指向的字元指標。

char * (*p) , 就表示這個位址中存放的數(是個字元資料)

char * *p;//定義指向字元指標(資料)的指標變數p

char *name = ; //定義指標資料name,每個陣列元素name[i]相當於乙個指標變數,都可指向乙個char型變數

p = name + 2; //使p 指向name[2],即p的值是name[2]的位址,是個位址,。此時 *p 就代表name[2],是個數

cout << *p << endl; //輸出name[2],即c++

cout << **p << endl;//輸出name[2]的首字元,即c

C C 難點指標和巨集的使用

1 陣列指標及型別 int a 10 a為乙個固定的指標值,a存的是 記憶體中a 10 的第一位置。其實為陣列length 2的記憶體空間 int a sizeof new採用型別的大小,名稱和定義名稱伴隨一人型別定義,2 結構體 c 結構體,就是資料的集合,只有成員變數,沒有方法。c 結構體和 c...

C C 易錯難點筆記01

c 是一門神奇的語言,很多時候你對底層不熟悉,很難知道某些情況下的結果,下面是我不斷積累的疑惑點,這裡將其記錄下來。class a class b public a int tmain int argc,tchar argv 下面語句發生什麼變化。b pb b pa 答 不能覆蓋,派生類重寫基類的虛...

C C指標的型別轉換

很多時候我們總是會將指標強制進行型別轉換,通過實驗和了解,總結一下規律,這裡記錄下來,方便以後自己使用 1 低位元組向高位元組轉換 比如 int float int型佔據4個位元組,但是float佔據8個位元組,起初你的資料是存放到4個位元組中的變數的,而後轉換成8位元組,讀取的時候會先讀取4位元組...