文章目录
- 1.变量的组成
- 2.指针
- 2.1 定义
- 2.2 使用指针操作变量
- 2.3 为什么使用指针
- 3.引用
- 3.1 定义
- 3.2 引用注意事项
- 4.引用和指针的区别
1.变量的组成
变量的组成:变量地址,变量名,变量值
例:
int i = 12;
2.指针
2.1 定义
指针用于存放一个变量在内存中的地址,通过指针间接操作这个变量。指针变量本身也是一个变量,也有变量地址,变量名,变量值。
例:
int i = 12;
int *p; //声明一个整型指针变量p
p = &i; //将i的地址赋给指针变量p
&为取地址符。
int *p = &i;
等价于
int *p; //声明一个整型指针变量p
p = &i; //将i的地址赋给指针变量p
指针变量p的变量值存放变量i的地址。
*p指向变量i的值
2.2 使用指针操作变量
通过 *p改变变量i的变量值
int i= 12;
int *p = &i; //声明一个整型指针变量p
*p=13;
cout << i << endl;//输出i=13
2.3 为什么使用指针
可以通过变量名i直接改变变量值,为什么通过指针呢?
其实通过变量名改变变量值,中间也是通过地址去访问的。
从运行栈的角度考虑
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
指针变量ip,dp,fp,ch的内存空间一般都是四字节,所有指针的值的实际数据类型,都是一个代表内存地址的长的十六进制数。
在栈上运行指针,比运行实际的变量所占的内存小, 把指针放到栈中能有效节省空间还能节省传递大参数时所耗费的时间 ,所以能更快, 而且栈空间很小很宝贵 , 不可能把大数据压进去的。
3.引用
3.1 定义
- 引用是某个变量的别名,相当于某个变量的第二个名字。对引用的操作,就相当于对变量的操作
引用形式- 引用是用&引导定义:类型 &引用名=变量名;
int i = 12;
int &j = i;
cout<<"i="<<i<<" "<<"j="<<j<<endl;
//输出i=12 j=12
j = 13;
cout<<"i="<<i<<" "<<"j="<<j<<endl;
//输出i=13 j=13
cout<<"i的地址是:"<<&i<<endl;
//i的地址是:0x0001
cout<<"j的地址是:"<<&j<<endl;
//j的地址是:0x0001
3.2 引用注意事项
- 不能建立引用的引用
- 不能建立引用数组,不能建立数组引用
- 可以建立指针的引用,不能建立指向引用的指针
int i=0,a[10];
int &&ii=i; //错误,ii是引用的引用
int &&aa=a; //错误,aa是数组的引用
int &*ip=i; //错误,ip是指向引用的指针
int *pi=&i;
int *&pr=pi; //正确,pr是指针的引用
4.引用和指针的区别
相同点:
- 都是地址的概念;
- 指针指向一块内存,它的内容是所指内存的地址;
- 引用是某块内存的别名。
区别:
- 指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元,即指针是一个实体;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。
- 指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
- 指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了,从一而终。
- ”sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小;
- 指针和引用的自增(++)运算意义不一样;
- 引用没有 const,指针有 const,const 的指针不可变;
- 引用使用时无需解引用(*),指针需要解引用;
参考:
[1]http://t.csdnimg.cn/S3Fu1
[2]https://blog.csdn.net/shang_0122/article/details/104755481
[3]https://blog.csdn.net/tonglin12138/article/details/94555024