C/C++编程语言中的指针(pointer)你了解吗

 更新时间:2022年02月27日 17:24:44   作者:liitdar  
这篇文章主要为大家详细介绍了C/C++编程语言中的指针,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

1 What

指针,是 C/C++ 编程语言中的一个重要概念。指针通常可以理解为内存地址,而指针变量就是用来存放内存地址的变量。在同一 CPU 架构下,不同类型的指针变量所占用的存储单元的长度是相同的(而存放数据的变量因数据类型的不同,所占用的存储空间长度也不同)。例如,在 64 位操作系统(安装在 X64 CPU 架构之上)中,指针变量占用 8 字节。通过使用指针,不仅可以对数据本身进行操作,也可以对存储该数据的变量地址进行操作。

在 C/C++ 编程语言中,指针变量存储的是其指向的对象的首地址,指针指向的对象可以是变量(注意,指针变量也是变量)、数组、函数、对象等占据存储空间的实体。

下面通过一个简单的指针及其指向对象的信息关系图来进一步介绍指针。现假设有一个字符变量“c”,其内容为“A”,又有一个名称为“pChar”的指针(变量)指向该字符变量,因此字符变量“c”与指向其的指针“pChar”关系如下图所示:

 通过上图内容,可知:

  • 字符变量“c”的内存地址为“0x7ffefdc3ae00”;
  • 指针变量“pChar”指向的字符变量“c”对应的内存地址为“0x7ffefdc3ae00”,因此,指针变量的内容即为“0x7ffefdc3ae00”,从这里就可以知道,指针变量与其他变量不同,其存储的内容是内存地址(而其他变量通常存储用户数据);
  • 指针变量也是一种变量,其也是存储在内存空间中的,在上图中未将指针变量画在内存空间中是为了便于观察指针变量及其指向对象之间的关系。

2 用法示例

在本章中,将通过示例代码来介绍 C/C++ 编程语言中指针的具体用法。

2.1 示例

示例1的代码内容如下:

#include <iostream>
using namespace std;
int main()
{
    char c = 'A';
    cout << "c is: " << c << endl;
    cout << "address of c is: " << (void*)&c << endl << endl;
    char* pChar1 = &c;
    cout << "*pChar1 is: " << *pChar1 << endl;
    cout << "pChar1 is: " << (void*)pChar1 << endl;
    cout << "address of pChar1 is: " << &pChar1 << endl << endl;
    char* pChar2 = pChar1;
    cout << "*pChar2 is: " << *pChar2 << endl;
    cout << "pChar2 is: " << (void*)pChar2 << endl;
    cout << "address of pChar2 is: " << &pChar2 << endl << endl;
    char** pChar3 = &pChar2;
    cout << "**pChar3 is: " << **pChar3 << endl;
    cout << "*pChar3 is: " << (void*)(*pChar3) << endl;
    cout << "pChar3 is: " << (void*)pChar3 << endl;
    cout << "address of pChar3 is: " << &pChar3 << endl << endl;
    return 0;
}

编译并执行上述代码,(可能的)结果如下:

通过上述代码及其执行结果,可知:

  • 在 C/C++ 编程语言中,通过取地址运算符“&”可以获取到变量的内存地址;
  • 指向一般变量(如本例中的字符变量 c)的指针变量(如本例中的 pChar1 和 pChar2),为一级指针,而指向一级指针的指针变量(如本例中的指针变量 pChar3),为二级指针,依此类推;
  • 对指针变量进行赋值操作,需要满足指针级别的对应关系,如一级指针赋值给一级指针、二级指针赋值给二级指针,否则编译器会报错;
  • 通过指针操作符“*”可以获取指针变量指向的对象的内容,如本例中通过“*pChar1”可获取指针变量 pChar1 指向的字符变量 c 的内容;
  • 对于二级指针,使用一个指针操作符“*”获取到的是该指针指向的指针变量的内容,使用两个指针操作符“*”才能获取到该指针变量指向的指针变量指向的对象的内容——有点绕,具体看代码及运行结果:)
  • 在 C++ 编程语言中,可通过将内存地址强转为 void* 类型的方式,来打印其内容;

本例的指针及其指向的对象的相关信息,如下图所示:

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!      

相关文章

  • C++未定义行为(undefined behavior)

    C++未定义行为(undefined behavior)

    对于未定义行为,C++标准没有明确规定编译器们应该怎么做,那么执行的结果就是不可预料的。下面我们来详细探讨下
    2017-02-02
  • c++基础语法:构造函数与析构函数

    c++基础语法:构造函数与析构函数

    构造函数用来构造一个对象,主要完成一些初始化工作,如果类中不提供构造函数,编译器会默认的提供一个默认构造函数(参数为空的构造函数就是默认构造函数) ;析构函数是隐式调用的,delete对象时候会自动调用完成对象的清理工作
    2013-09-09
  • VC程序在Win32环境下动态链接库(DLL)编程原理

    VC程序在Win32环境下动态链接库(DLL)编程原理

    这篇文章主要介绍了VC程序在Win32环境下动态链接库(DLL)编程原理,包括了dll文件的原理与具体实现过程,对于深入掌握VC程序设计具有很好的参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • C++学习进阶篇之类大小计算和this指针

    C++学习进阶篇之类大小计算和this指针

    this是C++中的一个关键字,也是一个const指针,它指向当前对象,通过它可以访问当前对象的所有成员,下面这篇文章主要给大家介绍了关于C++学习进阶篇之类大小计算和this指针的相关资料,需要的朋友可以参考下
    2023-04-04
  • C++用两个栈实现一个队列(面试官的小结)

    C++用两个栈实现一个队列(面试官的小结)

    这篇文章主要给大家介绍了关于C++用两个栈实现一个队列的相关资料,这是来自一名面试官的小结,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • Qt数据库应用之实现数据的导入与导出

    Qt数据库应用之实现数据的导入与导出

    QT中涉及到数据库相关的项目,几乎都需要将少量的信息数据导出到文件保存好,然后用户可以打开该表格进行编辑,编辑完成后保存,再重新导入到软件中。所以本文将具体为大家介绍一下这一功能如何实现,感兴趣的可以跟随小编一起试一试
    2022-01-01
  • 函数指针的一些概念详解

    函数指针的一些概念详解

    首先看函数指针的语法,举一个最简单的例子,要创建一个函数指针,则它与它指向的函数,在参数个数类型以及返回值上都保持一致,跟重载的要求应该是一样的
    2013-09-09
  • C语言多线程开发中死锁与读写锁问题详解

    C语言多线程开发中死锁与读写锁问题详解

    死锁是指多个线程因竞争资源而造成的僵局(互相等待);有些公共数据修改的机会很少,但其读的机会很多。并且在读的过程中会伴随着查找,给这种代码加锁会降低我们的程序效率。读写锁可以解决这个问题;
    2022-05-05
  • Qt设计时钟效果

    Qt设计时钟效果

    这篇文章主要为大家详细介绍了Qt设计时钟效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C语言数据结构 链表与归并排序实例详解

    C语言数据结构 链表与归并排序实例详解

    这篇文章主要介绍了C语言数据结构 链表与归并排序实例详解的相关资料,需要的朋友可以参考下
    2017-01-01

最新评论