詳解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