指针、引用、*、&

53 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

官方解释 源于百度百科

指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。 [1] 

指针描述了数据在内存中的位置,标示了一个占据存储空间的实体,在这一段空间起始位置的相对距离值。在 C/C++语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。

指针 *

指针是一个伟大(很难)的东西,时常会乱飞,莫名其妙的报错。 首先,我们需要明白一个概念:

int* p;

这里,int* 代表一个新的数据类型,叫指针(指向int),而p则是我们定义的指针,p的值是一个地址,如果按照该地址读出内容,计算机会把它解析为int类型的数据。 而*p又是什么? 这里的 * 我们需要把它理解为 解引用,也就是说,对于一个指针p,加 * 之后,就变成p所指的那个地址的内容;例如:

int a = 6; //a的地址假设为0x012345
int *p = &a;

则,p=0x12345,*p=6

引用 &

引用即是别名,本质还是原来的那个变量,一般在传参的时候用; 如:

int a=5;
int &b=a;

这时候,b就是a的一个别名,修改b就是修改a; 而在int * p = &a,的时候,这个&怎么理解呢?&代表,取地址符,表示取a的地址

总结

在有int等数据类型的时候(定义的时候),* & 都代表了一种新的“数据类型” 在没有int等定义,*代表解引用,&代表取地址。 例子: 下面是按指针传参

void Func2(int *x)  // 这里有定义,所以*代表指针类型,即x是一个指针,x的值是地址
{ 
    (* x) = (* x) + 10; //这里*代表 解引用
} 
... 
int n = 0; 
Func2(&n);  // & 取地址
cout << "n = " << n << endl; // n = 10 

下面是按引用传参

void Func3(int &x)  //代表引用
{ 
    x = x + 10;  //x就是n的别名,对x操作就是对n操作
} 
... 
int n = 0; 
Func3(n); 
cout << "n = " << n << endl; // n = 10