美文网首页
指针详解 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++基础

    C++ 值传递、指针传递、引用传递详解C++中引用传递与指针传递区别 引用传递和指针传递的区别 引用的规则:(1)...

  • 指针详解 C++

    尊重原创:https://blog.csdn.net/weixin_39951988/article/detail...

  • 智能指针详解

    C++ 智能指针详解 一、简介由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 de...

  • 【C++】指针与指针变量详解

    我们来先看下指针和指针变量都是什么? 1.指针指的是地址。2.指针变量,首先 它是一个变量,是变量就有地址,所以指...

  • C++中this指针详解

    1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。 t...

  • C/C++指针详解

    在大一的课程C语言程序设计中,课本上对于指针这块的讲解太浅了,所以一直对指针的概念不明确,在看了《C++ Prim...

  • C++函数指针详解

    定义 每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。 2. 语法 ...

  • C++知识点

    C++基本方法: C++ memcpy C++基本特性: C++引用(vs指针) C++指针 C++封装: 将...

  • C++指针与引用详解

    Q:指针是什么? A:指针本身不存储数据,存储的是数据存放的地址 一个变量的地址称为该变量的“指针”,存放该...

  • 详解C++指针和引用

    C++是在C语言的基础上发展来的。C++除了有C语言的指针外,还增加一个新的概念——引用,初学者容易把引用和指针混...

网友评论

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

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