C 9 指標,引用

2021-10-13 15:35:36 字數 3594 閱讀 4731

2.空指標、void指標

3.指標和引用

4.指標和陣列

《老九學堂c++課程》《c++ primer》學習筆記。《老九學堂c++課程》詳情請到b站搜尋《老九零基礎學程式設計c++入門》

-------------簡單的事情重複做,重複的事情用心做,用心的事情堅持做(老九君)---------------

指標是乙個值為記憶體位址的變數(資料物件)。也就是說指標它一樣是乙個變數,只不過該變數中存放的是另乙個物件的記憶體位址,存放另乙個物件的位址的操作又叫指向了該物件。

(位址是與作業系統程序有關,都不一樣。)

1.變數名–位址的助記符

2.定義指標時不賦初值,指標叫野指標。強烈建議初始化所有指標,並在可能的情況下,盡量等定義了變數之後再定義指向它的指標.

3.指標指向的物件可以改變(可以通過賦值–去位址符號改變指標的內容)

4.特定型別的指標只能存放該型別物件的位址

5.指標沒有釋放可怕

資料型別 * 指標變數名 // 定義乙個指向(資料型別)變數的指標

int *ptr_num;

int *ptr_name;

int *money_ptr;

double *p_price;

星號靠前靠後都是定義指標型變數,只是在多個連續定義的時候需要注意

int* a,b,c; //只有a為指向int 型別變數的指標,b、c是一般的int 型變數

int *a, *b, *c; //定義了3個指向int 型別變數的指標

注意1:推薦將*靠後結合;

int year;

year = 2021; // year 所對應的變數塊中存放這2021,這個變數塊實際是通過其對應的位址找到它的

int *ptr_year; // 定義了乙個指標變數

ptr_year = &year; // 將變數year的位址出來賦給指標變數,怎麼稱呼ptr_year:說的是ptr_year指向了year這個變數

–作用於乙個指標變數,取變數中的位址,然後對該位址對應的記憶體空間進行操作

int num = 1024;

int *ptr_num;

ptr_num = #

*ptr_111; //等價於 num = 111;

注意2:宣告中使用 * 和 後續使用*效果完全不一致;

demo1:指標的一般使用

int

main()

輸出:

ptr_num 的值: 0x7ffee273f630

0x7ffee273f630

ptr_num指向空間的值: 1024.5

demo2:字元指標在輸出時候的注意事項

int

mian()

不指向任何物件的,用來初始化指標,避免出現野指標。在試圖使用乙個指標前可以檢查它是否為空。

int *ptr1 = nullptr; // nullptr 字面值常量 =0, 可以被轉換成任何型別的指標

int *ptr2 = 0;

也等價於

# include

int *ptr3 = null

一種特殊的指標型別,可以存放各種型別變數的位址

demo

int

main()

物件的乙個別名,使用引用訪問變數時直接用引用名就可以了,不需要和指標一樣用*。

引用只能繫結在物件上,不能與字面值或者某個表示式的計算結果繫結在一塊。

引用都必須初始化,所以引用使用之前不需要測試其有效性。

指標賦值時的& 符號會驗證位址是否有效(編譯器內部機制?)而引用更不需要,所以引用使用起來效率更高。

int int_val =

1024

;int

& refvalue = int_val; # 定義了變數int_val的引用refvalue

一般情況下常量的引用是錯的,但是如果一定要定義乙個常量的引用給可以使用const

double ref =

100.0

;//❌]

const

double ref =

100.0

;//☑️

引用和指標的關係

1.引用是對指標進行了簡單的封裝,底層仍然是指標。

2.引用在獲取位址時,編譯器內粗會進行* 操作。

c++提倡使用引用,而少用*

int num =

108;

int& rel_num = num;

rel_num =

118;

cout <<

&num <<

'\t'

<<

&rel_num << endl;

輸出

0x7ffee750f60c

0x7ffee750f60c

陣列資料是一塊連續的記憶體位址,陣列名就是這塊連續記憶體空間的首位址

(但是實際上資料名對應的資料型別為double[5] 所有用sizeof 輸出時就顯示原型了)

int

main()

;double

*ptr_score = score;

//不需要取位址符號

cout <<

sizeof

(score)

<<

'\t'

<<

sizeof

(ptr_score)

<< endl;

cout << ptr_score[2]

<< endl;

return0;

}

40

833

int

main()

;double

*ptr_score = score;

for(

int i =

0; i <

5; i++

)return0;

}

int num[50]

;//num陣列名,也可以理解成陣列的首位址

// num的值和&num[0] 的值一致

// 陣列第i+1個元素可以表示為: num[i+1] 或者 *(num+i+1)

// 為指向陣列的指標賦值

int*ptr_num = num;

int*ptr_num =

&num[0]

;//指標變數也可以指向陣列元素

int*ptr_num =

&num[4]

int*ptr_num = num +

4

C9 高階指標

一 指標變數的定義和使用 二 取值運算子 三 取值運算子 四 指標的算術運算 typedef struct student student typedef struct cpoint cp typedef struct teacher teacher 命名 全大寫 或 k 駝峰命名法typedef ...

C語言基礎(9) 指標

指標與陣列 指標變數定義的一般形式 型別 指標變數名符號 在變數宣告語句中是指標型別說明符,前面的型別用於宣告指標可以指向哪種型別的變數,稱為指標的基型別。例如 int pt1 int pt2 int a 520 int pt a 用 運算子可以獲取指標變數所指向變數的內容,該運算子被稱為指標變數間...

實驗9 指標1

1 程式填空 下列程式在陣列中同時查詢最大元素和最小元素的下標,分別存放在 main 函式的max 和 min 變數中。要求 根據執行結果分析程式和填空,並注釋說明填充依據。include void findbypoint int int,int int void find int a,int n,...