指针详解 C++

2020-04-22  本文已影响0人  洛丽塔的云裳

尊重原创:
https://blog.csdn.net/weixin_39951988/article/details/87773322#%E4%B8%80.%E5%8F%98%E9%87%8F%E7%9A%84%E5%86%85%E5%AD%98%E5%AE%9E%E8%B4%A8%E5%88%B0

https://www.cnblogs.com/aquester/p/11469872.html

1.变量

1.1 变量介绍

要理解指针,首先就要理解“变量”的存储实质

如图所示,内存只不过是一个存放数据的空间,可以理解为装鸡蛋的篮子,装水果的箱子,或是装RMB的钱包,随便啦,反正就是这么一个很随意的玩意……现在我们把它想象成电影院的座位,电影院中的每个座位都要编号,而我们的内存要存放各种各样的数据,当然我们要知道我们的这些数据存放在什么位置吧!所以内存也要象座位一样进行编号了,这就是我们所说的内存编址(为内存进行地址编码)。座位可以是遵循“一个座位对应一个号码”的原则,从“第 1 号”开始编号。而内存则是按一个字节接着一个字节的次序进行编址,如上图所示。每个字节都有个编号,我们称之为内存地址。
内存编址 当我们在程序中写下了这样的语言声明:

1.2 变量的存储

下面来看看&i 是什么意思?是取 i 变量所在的地址编号嘛!我们可以这样大声读出来:返回 i 变量的地址编号。你记住了吗?如果没有,在读一遍:返回 i 变量的地址编号。 测试文件结构
#ifndef POINTER_H
#define POINTER_H
class Pointer {
    public:
        int i, j;
        char c;
    public:
        Pointer();
        void myTest();
};
#endif
#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;
}

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 = &pi;
    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 = &pi;
    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;
}
上一篇 下一篇

猜你喜欢

热点阅读