文章目录
一、理解指针的基础,重要指数5星
一个变量的组成:变量地址,变量名,变量值
如int i=10
二、指针
2.1是什么
指针用于存放一个变量在内存中的地址,通过指针间接操作这个变量
如:int *p; 声明一个整型指针变量p,指向某个int类型的变量
代码举例
实现指针p指向变量i
int i= 10;
int *p; //声明一个整型指针变量p
p=&i;//将i的地址赋给指针变量p
p=&i中,&为取址,取变量i的地址
图解代码
因为指针变量本身也是一个变量,也有变量地址,变量名,变量值
从上图可以看出指针p的变量值存放变量i的地址
2.2如何使用指针操作变量
运用*p来代表变量i中的变量值,也就是说通过 *p改变变量i的变量值
具体代码
int i= 10;
int *p; //声明一个整型指针变量p
p=&i;//将i的地址赋给指针变量p
*p=11;
cout << i << endl;//输出i=11
补充*的使用
- int* p(类型名* 变量名): *表示一个指针类型
- *p (*变量名):*表示间接寻址运算符
2.3为什么使用指针
可能有童鞋问了,可以通过变量名i直接改变变量值,为什么通过指针呢
其实通过变量名改变变量值,中间也是通过地址去访问的
下面从运行栈的角度考虑
举例
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
指针变量ip,dp,fp,ch的内存空间一般都是四字节,所有指针的值的实际数据类型,都是一个代表内存地址的长的十六进制数。
在栈上运行指针,比运行实际的变量所占的内存小, 把指针放到栈中能有效节省空间还能节省传递大参数时所耗费的时间 ,所以能更快, 而且栈空间很小很宝贵 , 不可能把大数据压进去的。
三、引用
3.1引用是什么
引用是某个变量的别名,相当于某个变量的第二个名字
对引用的操作,就相当于对变量的操作
引用形式
- 引用是用&引导定义:类型 &引用名=变量名;
比如:英雄联盟的别名叫LOL
类型 &引用名=变量名;
Game &LOL=英雄联盟;
3.2引用的简单例子
证明:ir是i的别名,对ir的操作就相当于对i的操作
#include<isotream.h>
void main()
{
int i =9;
int &ir =i;
cout<<"i="<<i<<" "<<"ir="<<ir<<endl;//i=9 ir=9
ir=20;//改变ir的值
cout<<"i="<<i<<" "<<"ir="<<ir<<endl;//i=20 ir=20
cout<<"i的地址是:"<<&i<<endl;//i的地址是:0x0012FF34
cout<<"ir的地址是:"<<&ir<<endl;//ir的地址是:0x0012FF34
}
图解代码
对ir的操作就相当于对i的操作
3.3使用引用注意点
- (1)不能建立引用的引用
- (2)不能建立引用数组,不能建立数组引用
- (3)可以建立指针的引用,不能建立指向引用的指针
代码说明
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.1为什么C++要引入引用
其实从本质上看,引用就是加了约束的指针,引用改善了指针的不足之处
4.2指针不足之处
- 操作空指针:被赋值为0的指针
- 操作野指针:未被初始化的指针
- 不知不觉改变了指针的值,而后还以为该指针正常。
4.3引用改善指针
- 引用必须初始化(保证没有野指针)
- 初始化就是现存变量的别名(保证不是空指针)
- 一个引用永远指向他初始化的那个对象(保证指针值不变)。