C C 指標和引用

2021-10-06 12:42:35 字數 3784 閱讀 2453

指標是c語言的靈魂。通過指標,可以輕鬆地訪問記憶體中的資料,對資料進行讀寫

概念:指標是變數,用來存放記憶體位址,位址一般用16進製制的數字表示,用來唯一標識一塊記憶體,我們可以通過&獲取變數的位址

指標變數的定義語法:資料型別* 變數名;

指標變數與普通變數的區別:普通變數存放資料,指標變數存放位址;指標變數可以通過*操作符操作指標變數指向的那塊空間,這個過程稱為解引用

指標的大小:指標在32位平台是4個位元組,在64位平台是8個位元組(與指標的型別無關)

int i =10;

char c =

'y';

int* pi =

&i;char

* pc =

&c;printf

("%d\n"

,sizeof

(pi));

//32位平台輸出4,64位平台輸出8

printf

("%d\n"

,sizeof

(pc));

//32位平台輸出4,64位平台輸出8

指標的型別:指標的型別決定了指標進行+/-操作的結果,也決定了對指標解引用時可以操作幾個位元組

int i =10;

char c =

'a';

int* pi =

&i;char

* pc =

&c;printf

("%p\n"

, pi)

;printf

("%p\n"

, pi +1)

;printf

("\n");

printf

("%p\n"

, pc)

;printf

("%p\n"

, pc +1)

;

執行以上**,結果如下:

可以看到,int*型別的指標+1,位址數值+4;char*型別的指標+1,位址數值+1。同時,對int*型別的指標進行解引用操作可以訪問4個位元組的資料,對char*型別的指標進行解引用操作只能訪問1個位元組的記憶體

空指標:空指標是指向記憶體編號為0的空間的指標,空指標指向的記憶體不可以訪問,主要作用是初始化變數

// 定義乙個double型別的指標變數,指向記憶體位址為0的空間

double

* pd =

null

;// 對空指標進行解引用操作進行訪問,賦給double型別的變數

// 此條語句執行出錯,記憶體編號0 ~255為系統占用記憶體,不允許使用者訪問

double d =

*pd;

野指標:指向非法記憶體空間的指標

const與指標:

// 定義兩個變數m和n,並為它們賦初始值

int m =10;

int n =20;

// const修飾指標,指標的指向可以修改,但指向的值不能修改

const

int* pm =

&m;pm =

&n;// 正確,指向可以修改

//*pm = 30; // 報錯,指向空間裡的值(*pm)不可修改

// const修飾常量:指標的指向不能修改,但指向的值可以修改

int*

const pn =

&n;//pn = &m; // 報錯,指向(pn)不可修改

*pn =40;

// 正確,指向空間裡的值(*pn)可以修改

指標和函式:利用指標作函式的引數,可以修改實參的值;若不想修改實參,也可以用值傳遞的方式

#include

void

swap1

(int a,

int b)

void

swap2

(int

* pa,

int* pb)

intmain()

引用是 給變數取的別名 ,不是新定義乙個變數,引用型別必須和引用實體型別相同;引用和它引用的變數共用同一塊空間;語法:型別& 引用名 = 引用實體;

int a =10;

// 定義乙個int型別的變數a

int& ra = a;

// 使用引用給a起乙個別名ra

printf

("a=%d \nra=%d\n\n"

, a, ra)

;// a與ra的值相同

printf(,

&a,&ra)

;// a與ra的位址相同

引用的特性:

int a =10;

int b =20;

//int& ra; // 報錯,需要初始化

int& ra1 = a;

int& ra2 = a;

ra1 = b;

// 這是賦值操作,並不是把ra1修改為了b的引用

// 使用引用傳參的函式可以完成對值的交換

void

my_swap

(int

& a,

int& b)

intmain()

引用做函式返回值:引用可做函式引數的返回值,但引用做函式引數返回值時,所返回的變數的生命週期必須比函式更長,不能返回區域性變數

// 引用做函式返回值

int&

test_ref1

(int

& a)

// 函式返回區域性變數的引用

int&

test_ref2

(int a,

int b)

intmain()

引用雖然是給變數取的別名,和所引用的變數共用同一快空間,但引用在c++內部實現是乙個指標常量(指向不可改變,指向的值可以改變)

指標和引用的不同點:

指標引用

指標宣告時不是必須要初始化

引用在宣告時就要初始化

指標有null指標

沒有null引用

指標可以隨時修改指向,使其指向另乙個同型別的實體

引用一旦引用某個實體,就不能進行修改

指標++的結果是向後偏移乙個資料型別的大小

引用++是將引用實體+1

修改指標指向的值時,需要進行解引用操作

修改引用實體時,不需要解引用,可以直接修改引用達到修改引用實體的效果

指標的大小與型別無關,只與平台有關

引用的大小是實體的大小

指標有多級指標

沒有多級引用

操作指標可能會引發危險

引用的使用相對安全

C C 指標和引用區別

引用是別名,所以自身沒有空間,那麼必須與乙個合法的儲存單元關聯,所以定義必須初始化,所以引用不能為空,沒有null引用。指標是型別,有空間,可以為null,適用於動態分配記憶體。本質區別就是引用是別名,指標是型別,所以才表現出各自不同的特點。參考 1 儲存空間 指標是實體,有記憶體空間 引用是別名,...

C C 中的引用和指標

引用又稱 別名,它可以最為物件的乙個名字,但它既不是物件的指標,也不是物件的副本。通過引用可以間接地操作物件,使用方式類似於指標,但不需要指標的語法。使用規則 1 引用被建立的同時必須被初始化,指標可以在任何時候被初始化 int a 12 int b a 正確 int c 錯誤 2 一旦引用被初始化...

C C 中的引用和指標

引用又稱 別名,它可以視為物件的乙個名字,但它既不是物件的指標,也不是物件的副本。通過引用可以間接地操作物件,使用方式類似於指標,但不需要指標的語法。使用規則 1 引用被建立的同時必須被初始化,指標可以在任何時候被初始化 int a 12 int b a 正確 int c 錯誤 2 一旦引用被初始化...