详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别
2015-09-06 10:26
706 查看
/从网上搜到的一篇不错不错的总结,稍作修改后转之:)/
上面
所以这里指针p指向了num所对应的地址,输出即是地址。
注意这里*操作符为解引用操作符,它返回指针p所指的地址所保存的值。
我们可以对*p赋值,从而改变p所指的地址上说保存的值,从而改变指向此地址的变量num的值。(num的值变为100)
当然,我们也可以给指针p赋值,使其指向另外一个地址:
由于指针也要占用内存空间存放其值,所以我们也可以定义一个指向指针的指针。
b)指针与数组:
指针和迭代器非常像,我们可以说指针就是数组的迭代器:
对于多维数组,只要把指向指针的指针理解好了就行:
于鄙人机器上输出结果为
一、初步了解——指针与取地址
先看程序:#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# Pointer指针应用实例简述
- C++智能指针实例详解
- C++指向函数的指针实例解析
- 关于c语言指针的两处小tip分享
- 浅析iterator与指针的区别
- 探讨C++中数组名与指针的用法比较分析
- 详解C++中的指针、数组指针与函数指针
- C语言安全之数组长度与指针实例解析
- C++中指向对象的常指针与指向常对象的指针详解
- 指向变量的常指针与指向常变量的指针详细解析
- C#通过指针实现快速拷贝的方法
- php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
- C#通过指针读取文件的方法
- C语言指针学习经验总结浅谈
- C++交换指针实例
- C/C++中指针和引用之相关问题深入研究
- C++基础入门教程(四):枚举和指针
- c++传递函数指针和bind的示例
- 指针与const限定符的使用分析