https://www.cnblogs.com/aquester/p/11469872.html
1.变量
1.1 变量介绍
要理解指针,首先就要理解“变量”的存储实质
如图所示,内存只不过是一个存放数据的空间
,可以理解为装鸡蛋的篮子,装水果的箱子,或是装RMB的钱包,随便啦,反正就是这么一个很随意的玩意……现在我们把它想象成电影院的座位,电影院中的每个座位都要编号,而我们的内存要存放各种各样的数据,当然我们要知道我们的这些数据存放在什么位置吧!所以内存也要象座位一样进行编号了,这就是我们所说的内存编址(为内存进行地址编码)。座位可以是遵循“一个座位对应一个号码”的原则,从“第 1 号”开始编号。而内存则是按一个字节接着一个字节的次序进行编址,如上图所示。每个字节都有个编号,我们称之为内存地址。
内存编址 当我们在程序中写下了这样的语言声明:
- int i;
-
char a;
内存中的映象如下图所示:
时,它其实是内存中申请了一个名为 i 的整型变量宽度空间(有些机器2个字节,有些机器4个字节),和一个名为 a 的字符型变量宽度的空间(占 1 个字节)。
图中可看出,i 在内存起始地址为 6 上申请了两个字节的空间(我这里假设
了 int 的宽度为 16 位,不同系统中 int 的宽度可能是不一样的,最常用的win32环境下为4个字节),并命名为 i。
a 在内存地址为 8 上申请了一字节的空间,并命名为 a。这样我们就有两个不同类型的变量了。变量有了接下来我们考虑的就是如何给变量进行赋值啦。
你当然知道个两个语句是将 30 存入 i 变量的内存空间中,将“t”字符存入 a 变量的内存空间中。我们可以利用这样来形象理解:
再看下面赋值:
i = 30;
a = ’t’;
1.2 变量的存储
下面来看看&i 是什么意思?是取 i 变量所在的地址编号嘛!我们可以这样大声读出来:返回 i 变量的地址编号。你记住了吗?如果没有,在读一遍:返回 i 变量的地址编号。 测试文件结构- pointer.h
#ifndef POINTER_H
#define POINTER_H
class Pointer {
public:
int i, j;
char c;
public:
Pointer();
void myTest();
};
#endif
- pointer.cpp
#include <iostream>
#include <string>
#include "pointer.h"
using namespace std;
Pointer::Pointer() {
std::cout << "创建一个对象" << std::endl;
}
void Pointer::myTest() {
// i默认初始化, 查看对应的地址空间
std::cout << "i: " << i << " -> &i: " << &i << std::endl;
// j已经赋值了,查看对应的地址;
std::cout << "j:" << j << " -> &j: " << &j << std::endl;
std::cout << "c:" << c << " -> &c: " << &c << std::endl;
// 查看不同类型的字节
std::cout << "sizeof(int): " << sizeof(int) << std::endl;
std::cout << "sizeof(char): " << sizeof(char) << std::endl;
return;
}
int main() {
Pointer pointer;
pointer.j = 1;
pointer.c = 'c';
pointer.myTest();
return 0;
}
- 编译执行。
g++ -std=c++11 -o ./test pointer.cpp
- 测试结果。 输出的&i的值
0x7ffeee7cbac0
就是在内存空间编码中的地址。
在本机器上,int占4个字节,char占1个字节。
2. 指针
2.1 什么是指针?
下面看一条声明一个指向整型变量的指针的语句:
int *pi;
pi 是一个指针,其实,它也只过是一个变量而已。与上一篇中说的变量并没有实质的区别。好了,这就是指针。仅此而已,就这么简单。不信你看下图:
pi 也只不过是一个变量而已嘛!那么它又为什么会被称为“指针”?关键是我们要让这个变量所存储的内容是什么。现在我要让 pi 成为具有真正“指针”意义的变量。请接着看下面语句:
pi = &i;
这样大声读:
把 i 地址的编号赋值给 pi
。并记下来。也就是你在 pi 里面写上 i 的地址编号.因此,我们就把 pi 称为指针。
所以你要牢牢记住:指针变量所存的内容就是内存的地址编号 !
2.2 指针示例
#include<iostream>
using namespace std;
int main() {
int i = 30;
std::cout << "&i: " << &i << std::endl;
std::cout << "i: " << i << std::endl;
int *pi = &i;
std::cout << "pi: " << pi << std::endl;
std::cout << "&pi: " << &pi << std::endl;
std::cout << "*pi: " << *pi << std::endl;
}
测试结果
上面例子中*pi 是什么意思呢?
pi 所指的地址的内容
pi虽然是指针,但本身是个变量,存储地址是&p,
0x7ffeebc60ac0
; 其中p的值是 所指内容
3 二级指针?
二级指针指向一个指针的指针。
二级指针示意图
#include<iostream>
using namespace std;
int main() {
int i = 30;
int *pi = &i;
std::cout << "一级指针&pi: " << &pi << std::endl;
std::cout << "一级指针*pi: " << *pi << std::endl;
int **ppi = π
std::cout << "二级指针ppi: " << ppi << std::endl;
std::cout << "二级指针**ppi: " << **ppi << std::endl;
}
间接数据访问
#include<iostream>
using namespace std;
int main() {
int i = 30;
int *pi = &i;
int **ppi = π
std::cout << "一级指针: *pi: " << *pi << std::endl;
std::cout << "二级指针: *ppi: " << **ppi << std::endl;
*pi = 20;
std::cout << "改变一级指针: *pi: " << *pi << std::endl;
int j = 40;
*ppi = &j;
std::cout << "改变二级指针: **pi: " << **ppi << std::endl;
}
网友评论