您的位置:首页 > 编程语言 > C语言/C++

详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别

2015-09-06 10:26 706 查看
/从网上搜到的一篇不错不错的总结,稍作修改后转之:)/

一、初步了解——指针与取地址

先看程序:

#include<cstdio>

int main(void)
{
int num = 7;
int *p = #
printf("%d 的地址是 %p\n", num, p);
return 0;
}


上面
int *p
定义了一个指向int类型指针p(我们使用*符号把p声明为指针),并初始化p使其指向int类型的变量num,这里&num中的&是取地址操作符,当&作用于一个变量/对象上时,它返回了该对象的地址。

所以这里指针p指向了num所对应的地址,输出即是地址。

二、如何使用指针?——解引用与指针赋值

#include<cstdio>

int main(void)
{
int num = 7;
int *p = #
printf("数值%d所在的地址是 %p\n", num, p);
printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d\n", p, *p);
*p = 100;
printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d\n", p, num);
return 0;
}


注意这里*操作符为解引用操作符,它返回指针p所指的地址所保存的值。

我们可以对*p赋值,从而改变p所指的地址上说保存的值,从而改变指向此地址的变量num的值。(num的值变为100)

当然,我们也可以给指针p赋值,使其指向另外一个地址:

#include<cstdio>

int main(void)
{
int num = 7, another = -5;
int *p = #
p = &another;
printf("%d\n", *p);//-5
return 0;
}


三、引用

从某种意义上来说,引用完全有别于上面说介绍的内容:

#include<cstdio>

int main(void)
{
int val = 7, val2 = 999;
int &refval = val, &refval2 = val2; ///引用必须要初始化,使其绑定到一个变量上
///修改引用的值将改变其所绑定的变量的值
refval = -12;
printf("%d %d\n", val, refval);//-12,refval的值和val一样

///将引用b赋值给引用a将改变引用a所绑定的变量的值,
///引用一但初始化(绑定),将始终绑定到同一个特定对象上,无法绑定到另一个对象上
refval = refval2;
printf("%d %d\n", val, refval);//999
return 0;
}


四、补充

a)指向指针的指针:

#include<cstdio>

int main(void)
{
int val = 7;
int *p = &val;
int **p2 = &p;///**声明一个指向指针的指针
printf("val的值为%d %d",*p,**p2);///**p2为两次解引用,可看做*(*p2)
return 0;
}


由于指针也要占用内存空间存放其值,所以我们也可以定义一个指向指针的指针。

b)指针与数组:

指针和迭代器非常像,我们可以说指针就是数组的迭代器:

#include<cstdio>

int val[100];

int main(void)
{
for (int i = 0; i < 100; ++i)
val[i] = i;
int *p = val;///等价于int *p = &val[0];
///数组的变量名就是一个指针
printf("%d\n", *p); ///指针p指向val的第一个元素,即val[0]

int t = 100;
while (t--)
///可以直接对指针进行加减运算,就和迭代器一样
printf("%d\n", *(p++));///输出0~99

///指针可以做差,用数组思维去领会:
int *p2 = &val[10], *p3 = &val[20];
printf("%d\n", p3 - p2); //10
printf("%d\n", p2 - p3); //-10

///还可以比比较大小:
printf("%d\n", p2 < p3 ? p3 - p2 : p2 - p3); //10
return 0;
}


对于多维数组,只要把指向指针的指针理解好了就行:

#include<cstdio>

int val[100][100];

int main(void)
{
val[2][1] = 666;
///如何用指针取出val[2][1]?
printf("%d\n", *val);
printf("%d\n", *(val + 2));
printf("%d\n", *(val + 2) + 1);
printf("%d\n", *(*(val + 2) + 1));
return 0;
}


于鄙人机器上输出结果为

134520960  -- 首地址
134521760  --+ 4B*100*2
134521764  --+ 4B
666


Reference

http://www.csdn123.com/html/itweb/20130824/79913_79908_79897.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  指针 c++基础