关于指针的讨论
深入知识
首先我们在这里定义
int x = 1;
int y = 2;
int* p;
根据内存的知识我们知道,int变量x和int指针变量p,分配在一段连续的内存当中
变量名 | x | y | p |
---|---|---|---|
内存地址 | 8 | 4 | 0 |
当我们在计算机里定义好变量之后,我们划分一定的内存空间给这些变量,对于一个int
变量而言,内存中存储的值可以改变,可是x变量的地址是不会变的
p = &x;
这样我们可以使指针发挥用处,经过这个指令后,p中存储的是x变量的地址
我们知道,系统读取一个变量的值的过程:
- 根据变量名找变量所在地址
- 根据地址找内存中存的值
因此,我们来看p的值
cout << p;
此时,输出的将是一串地址,也就是变量x的地址
我们再输出解引用操作后的值:
cout << *p;
此时输出的将是指针变量p所存储的地址中所存储的值
这样,我们对指针的基本工作有了一些了解
常量与指针
前提:常量和变量不能互相赋值
首先我们列出所有的四种可能:
关系表格
指针 | 被指数据 |
---|---|
变量Variable | 变量Variable |
变量Variable | 常量Constant |
常量Constant | 变量Variable |
常量Constant | 变量Variable |
这样对应着四种引用方式:
我们先看被指数据为变量的
int x = 1;
int* p = &x;
这是最常见的一种使用形式,我们对其进行分析
指针 | p |
---|---|
内存地址 | 不可变 |
存储的值 | 目前存储x的地址,可更改,可解引用修改变量值 |
变量 | x |
---|---|
内存地址 | 不可变 |
存储的值 | 目前是1,可随意变 |
2、
int x = 1;
int* const p = &x;
指针 | p |
---|---|
内存地址 | 不可变 |
存储的值 | x的地址,初始化后不可更改,不能通过解引用来修改变量值 |
变量 | x |
---|---|
内存地址 | 不可变 |
存储的值 | 目前是1,可随意变 |
这里的指针,首先是 const
类型,说明指针变量所储存的值不可变,在这里也就是只能指向x,因此指针p无法使用解引用操作来修改变量x的值
被指数据为常量
3、
const int x =1;
const int* p = &x;
指针 | p |
---|---|
内存地址 | 不可变 |
存储的值 | 目前是x的地址,可以更改,不能解引用修改变量 |
常量 | x |
---|---|
内存地址 | 不可变 |
存储的值 | 不可变 |
在这里,由于被指数据是一个常量,指针在这里可以理解为“只读”操作,它可以读取,但无法修改变量的值,也可以指向其他变量
4、
const int i = 1;
const int* const p = &i;
指针 | p |
---|---|
内存地址 | 不可变 |
存储的值 | 目前是x的地址,不可更改,不能解引用修改变量 |
常量 | x |
---|---|
内存地址 | 不可变 |
存储的值 | 不可变 |
这里的指针只能指向x,并且无法修改x的值,只有读取的功能
总结
对于指针的了解,要深入到内存存储中来分析
访问指针变量的地址——读取地址中的存储的值(其他变量的地址)——访问对应地址存储的值——解引用操作得到需要的值