美文网首页
指针详解 C++

指针详解 C++

作者: 洛丽塔的云裳 | 来源:发表于2020-04-22 14:09 被阅读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 号”开始编号。而内存则是按一个字节接着一个字节的次序进行编址,如上图所示。每个字节都有个编号,我们称之为内存地址。
    内存编址 当我们在程序中写下了这样的语言声明:
    • int i;
    • char a;
      时,它其实是内存中申请了一个名为 i 的整型变量宽度空间(有些机器2个字节,有些机器4个字节),和一个名为 a 的字符型变量宽度的空间(占 1 个字节)。

      内存中的映象如下图所示:
      图中可看出,i 在内存起始地址为 6 上申请了两个字节的空间(我这里假设
      了 int 的宽度为 16 位,不同系统中 int 的宽度可能是不一样的,最常用的win32环境下为4个字节),并命名为 i。

      a 在内存地址为 8 上申请了一字节的空间,并命名为 a。这样我们就有两个不同类型的变量了。变量有了接下来我们考虑的就是如何给变量进行赋值啦。
      再看下面赋值:
      i = 30;
      a = ’t’;

      你当然知道个两个语句是将 30 存入 i 变量的内存空间中,将“t”字符存入 a 变量的内存空间中。我们可以利用这样来形象理解:

    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 = &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;
    }
    

    相关文章

      网友评论

          本文标题:指针详解 C++

          本文链接:https://www.haomeiwen.com/subject/dznyihtx.html