詳解C++中指針(*)、取地址(&)、解引用(*)與引用(&)的區別 (完整代碼)


一、初步了解——指針與取地址

先看程序:

 

#include<cstdio>



int main(void)

{

	int num = 7;

	int *p = &num;

	printf("%d 的地址是 %p\n", num, p);

	return 0;

}

上面int *p定義了一個指向int類型指針p(我們使用*符號把p聲明為指針),並初始化p使其指向int類型的變量num,這里&num中的&是取地址操作符,當&作用於一個對象上時,它返回了該對象的地址。

 

所以這里指針p指向了num所對應的地址。(我測試時輸出了0028FF1C)

 

二、如何使用指針?——解引用與指針賦值

 

#include<cstdio>



int main(void)

{

	int num = 7;

	int *p = &num;

	printf("數值%d所在的地址是 %p\n", num, p);

	printf("指針p所指向的地址為 %p , 該地址上所保存的值為%d\n", p, *p);

	*p = 100;

	printf("指針p所指向的地址為 %p , 該地址上所保存的值為%d\n", p, num);

	return 0;

}

 

注意這里*操作符為解引用操作符,它返回指針p所指的地址所保存的值。

我們可以對*p賦值,從而改變p所指的地址上說保存的值,從而改變指向此地址的變量num的值。(num的值變為100)

當然,我們也可以給指針p賦值,使其指向另外一個地址:

 

#include<cstdio>



int main(void)

{

	int num = 7, another = -5;

	int *p = &num;

	p = &another;

	printf("%d\n", *p);//-5

	return 0;

}


三、引用

 

從某種意義上來說,引用完全有別於上面說介紹的內容:

 

#include<cstdio>



int main(void)

{

	int val = 7, val2 = 999;

	int &refval = val, &refval2 = val2; ///引用必須要初始化,使其綁定到一個變量上

	///修改引用的值將改變其所綁定的變量的值

	refval = -12;

	printf("%d %d\n", val, refval);//-12,refval的值和val一樣

	

	///將引用b賦值給引用a將改變引用a所綁定的變量的值,

	///引用一但初始化(綁定),將始終綁定到同一個特定對象上,無法綁定到另一個對象上

	refval = refval2;

	printf("%d %d\n", val, refval);//999

	return 0;

}

 

 

四、補充

a)指向指針的指針:

 

#include<cstdio>



int main(void)

{

	int val = 7;

	int *p = &val;

	int **p2 = &p;///**聲明一個指向指針的指針

	printf("val的值為%d %d",*p,**p2);///**p2為兩次解引用,可看做*(*p2)

	return 0;

}

由於指針也要占用內存空間存放其值,所以我們也可以定義一個指向指針的指針。

 

b)指針與數組:

指針和迭代器非常像,我們可以說指針就是數組的迭代器:

 

#include<cstdio>



int val[100];



int main(void)

{

	for (int i = 0; i < 100; ++i)

		val[i] = i;

	int *p = val;///等價於int *p = &val[0];

	///數組的變量名就是一個指針

	printf("%d\n", *p); ///指針p指向val的第一個元素,即val[0]

	

	int t = 100;

	while (t--)

		///可以直接對指針進行加減運算,就和迭代器一樣

		printf("%d\n", *(p++));///輸出0~99

		

	///指針可以做差:

	int *p2 = &val[10], *p3 = &val[20];

	printf("%d\n", p3 - p2); //10

	printf("%d\n", p2 - p3); //-10

	

	///還可以比比較大小:

	printf("%d\n", p2 < p3 ? p3 - p2 : p2 - p3); //10

	return 0;

}

 

對於多維數組,只要把指向指針的指針理解好了就行:

 

#include<cstdio>



int val[100][100];



int main(void)

{

	val[2][1] = 666;

	///如何用指針取出val[2][1]?

	printf("%d", *(*(val + 2) + 1));

	return 0;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM