关于C中指针的引用,解引用与脱去解引用

#关于C中指针的引用,解引用与脱去解引用

*,&在指针操作中的意义

(1)*

大家都知道在写int * p 时,* 可以声明一个指针。很少人知道* 在C/C++中还有一个名字就是“解引用”。他的意思就是解释引用,说的通俗一点就是,直接去寻找指针所指的地址里面的内容,此内容可以是任何数据类型,当然也可以是指针(这就是双重指针,后面将会讨论)。需要注意的是,在变量声明的时候,* 不能当做解引用使用,只是表示你声明的变量是一个指针类型。

example1:

int a=50;

int *p=&a ; // ‘&’的作用就是把a变量在内存中的地址给提取出来,具体后面解释。

*p=5 ; //这就是解引用,* 解释了 p对常量 50的内存地址的引用,解释结果就是直接去寻找p所指内容,因为p指向a,所以a的内容将被修改为5,而不是50。

(2) &

&表示的是引用,有 & 符号,就表示函数内的变量和主函数的变量是同一个,函数内改变它的值,主函数相应的变量也就跟着改变了;没有 & 符号,就表示函数内的变量是主函数的变量的一个副本,在函数内改变其值,是不会改变主函数中变量的值的。

& 在C/C++中具体 3种语义, 按位与,取地址 和 声明一个引用。

int a=0x0000002 & 0x00000003;//按位与

int *p= &a;//取地址,取出a在内存中的地址给p,这样就建立一个指针映射,使得p指a

int &a=b;//声明a是b的引用,对a操作修改也就是直接对b修改。

在指针操作中,& 还有一种叫法叫做“脱去解引用”,在这个表达式中&a*p(假设p是指针),& 脱去了 * 对 a 的解引用,从而得到抵消的效果,得到应该是 p 所指的变量的地址。

example2:

接example1。

println(“%x ||||| %x”,&ap,&a*p);

输出结果:

p在内存中的地址|||||a在内存中的地址

为什么呢?

首先 &a 去指针 p 的地址,然后 &a 脱去了 p 对 a 中5的引用,解引用和脱去解引用效果抵消,从而得到了 p 所指的变量的地址,也就是 a 在内存中的地址。