2020-12-13:一文讀懂“&引用”、“&取地址”和“*解析地址”的使用

小仙女的小跟班_fairy發表於2020-12-14

一文讀懂“&引用”、“&取地址”和“*解析地址”的使用

C++中才支援&引用的使用,C語言中僅支援&取地址,*解析地址的使用,請讀到文章的同志們注意,謝謝!

& 引用

常規引用

引用就是某一變數(目標)的一個別名,對引用的操作與對變數直接操作完全一樣。
作為引用的時候,必須在定義時候就進行初始化,若不進行初始化則會編譯報錯。

int N;
int &rN = N;

引用建立之後,後面操作建立的引用rN,也會同步到變數N上;

使用示例
#include <stdio.h>

int main()
{
	int N = 10;
	int &rN = N;
	rN = rN - 5;
	printf("N: %d\n", N);
	return 0;
}

*******
N: 5
*******
函式中使用引用function(int &i)

函式中傳遞形參如果是int &i的形式,也是變數的引用,具體示例如下

正常建立的函式
int function(int i){
	i++;
	return i;
}
使用引用變數作為形參的函式
int functionReference(int &i){
	i++;
	return i;
}
使用示例
int x = 5;
function(x);			// result: 6; x: 5
functionReference(x);	// result: 6; x: 6

& 取地址

&作為取地址用的時候,要跟指標聯絡在一起,因為指標就是用來存放地址的。
取地址就是你想取某變數(形參或者實參)的地址就用 & 前置表示要取地址了,取的是該變數的記憶體地址。

int N = 100;	// 定義變數N
int *p;			// 定義整形指標p
p = &N;			// 取變數N的地址,並使指標p指向改地址
使用示例
#include <stdio.h>
int main()
{
	int N = 100;
	int *p;
	p = &N;
	printf("N: %d\n", N);	// N的值
	printf("&N: %d\n", &N);	// N的地址
	printf("p: %d\n", p);	// p的值
	printf("*p: %d\n", *p);	// p存放的地址,取地址對應空間存放的值
	return 0;
}

&引用 和 &取地址的區別

引用的格式:
型別名 & 別名 = var;
1.定義的時候必須初始化,即& 前面有類名或型別名,&別名後面一定帶 “=” (在= 左邊);
2.&後面的別名是新的名字,之前不存在。

&取地址時:
如果&是取址運算子,也就意味著取一個變數的地址並付給指標變數。&後面緊跟的是變數(已存在);

* 解析地址,取地址空間中存放的值

*a表示:取出變數a中對應儲存地址空間中的值;首先,要求a對應的儲存單元中的資料一定是另一個儲存單元的地址。

int a;

變數a 本質上代表一個儲存單元。CPU通過該儲存單元的地址訪問該儲存單元中的資料。
所以a本來代表兩個值:儲存單元的地址和儲單元中的資料。
於是就有了二異性。
為了消除這種二義性,C語言規定a表示儲存單元中的資料,&a表示儲存單元的地址。
a儲存單元中的資料可以是一個普通數值,也可以是另一個儲存單元的地址,比如:a = &b;
語句就是將b的儲存單元的地址存入a儲存單元中。C語言規定*a代表a中儲存的地址對應的儲存單元中的資料,也就是訪問*a就等於訪問b,於是*a提供了通過a訪問b中的資料的手段。

a表示a對應的儲存單元中的資料。
&a表示a對應的儲存單元的地址。

使用示例
int a = 12;
int *b;
b = &a;
printf("a: %d\n", a);  	// 12
printf("b: %d\n", b);	// 6422024
printf("*b: %d\n", *b);	// 12

最後,在C語言裡地址叫指標。還有,在C語言中的陣列本質上其實也是指標,即:*a 等同於 a[]。
至於陣列和指標之間的實踐,可以參考另外一篇實踐;

C++語言中採用&引用的使用;C語言沒有&引用,在此說明,請注意!!!

完整示例如下:

#include <stdio.h>

int function(int i){
	i++;
	return i;
}

int functionReference(int &i){
	i++;
	return i;
}

int main()
{
	int N;
	int &rN = N;
	N = 10;
	rN -= 5;
	printf("N: %d\n", N);
	int i = 100;
	printf("i: %d\n", i);
	printf("function(i): %d\n", function(i));
	printf("i: %d\n", i);
	printf("functionReference(i): %d\n", functionReference(i));
	printf("i: %d\n", i);
	return 0;
}

PS

主要介紹 &引用、&取地址和*解析地址的使用和區別,僅為記錄總結之用!

相關文章