详谈指针*/**,引用

【指针*与&】

指针和数组有异曲同工之妙,在前面博客有专门解释过,,指针声明用*,凡是在声明一个变量前面加上这个符号,就是说明声明的这个变量是一个指针,它是一个地址,比如:

int a = 2;int *p;p = &a;

p就是一个指向整型变量的指针,p指向的是整型变量a的地址,而*在使用的时候还有一个别名,解引用,抵消了&引用功能,&在这里是引用a的地址。

*p = 1;//其实*p = *(&a) = a可以这么理解

在上例中其实就是对a值进行修改,按照注释的理解方式去思考,会觉得指针和引用的关系原来就是相互抵消的过程,*p取得是a的值,p和&a取得都是a的地址。&p注意一下是指针p在内存中的地址,指针p也是要占内存的。

【双重指针**】 双重指针即指针的指针,就是说一个指向指针的指针,定义如下,

;int a;int *x;x = &a;y = &x;

两个解引用的使用构成双重指针的声明,y作为一个双指针,初始化时应该是把一个指针的地址赋值给它,x与y之间的关系如下: 1.(*y)得到的是指针x的内存地址; 2.(**y)得到的是指针x的对象,指针x的对象就是a; 3.(*x)得到的是对象a的值;

【测试用例1】

#include<stdio.h>void main(){;int *x;int a =100;int *p;x = &a;y = &x;p = *y;printf(“a = %d, &a = %d\n”, a, &a);printf(“x = %d, &x = %d, *x = %d\n”,x,&x,*x);printf(“y = %d, *y = %d, **y =%d\n”,y, *y, **y);}

【输出结果】

从输出结果发现, **y = *x =a =100; *y = x = &a; y = &x 符合前面的论述,其次,例子中还有p和y之间的操作,这里就是举一个初始化y的另一种方式。 当函数想要操作的是指针本身时就可以用双指针。

【测试用例2】

#include<stdio.h>void main(){;int *x;int a[2]={100,103};int *p;x = &a[0];y = &x;p = *y;printf(“a[0] = %d, &a[0] = %d\n”, a[0], &a[0]);printf(“x = %d, &x = %d, *x = %d\n”,x,&x,*x);printf(“y = %d, *y = %d, **y =%d\n”,y, *y, **y);x = &a[1];printf(“a[1] = %d, &a[1] = %d\n”, a[1], &a[1]);printf(“x = %d, &x = %d, *x = %d\n”,x,&x,*x);printf(“y = %d, *y = %d, **y =%d\n”,y, *y, **y);}

输出结果:

改变了x指针的指向,而y也会改变,因为y始终指向的是x。

每个人在他的人生发轫之初,总有一段时光,

详谈指针*/**,引用

相关文章:

你感兴趣的文章:

标签云: