本文已参与「新人创作礼」活动,一起开启掘金创作之路。
官方解释 源于百度百科
指针,是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