您的位置:首页 > 其它

详谈指针*/**,引用&

2015-05-20 11:05 113 查看
【指针*与&】

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

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 **y;
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 **y;
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 **y;
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: