文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++中指针实例分析

2023-06-19 12:50

关注

这篇文章主要介绍“C++中指针实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中指针实例分析”文章能帮助大家解决问题。

计算机的内存模型

CPU是计算机的核心部件,要想让一个CPU工作,就必须向它提供指令和数据,指令和数据在存储器中存放,也就是我们平时说的内存。

内存分为:物理内存和虚拟内存,物理内存对应着计算机中的内存条,虚拟内存是操作系统内存管理系统假想出来的,由于这些不是我们本文的重点,我们就不做区分。

在不考虑cpu缓存的情况下,计算机运行程序本质上是对内存中的数据的操作,存储器被划分为多个存储单元,存储单元从零开始顺序编号,CPU要从内存中读取数据,首先要指定存储单元的地址。

CPU从内存中读取数据的过程如图所示:

C++中指针实例分析

计算机为了方便管理内存,将内存的每个单元用一个数字编号

指针与指针常量

指针的本意就是内存地址,我们可以通俗的理解成内存编号,既然计算机通过编号来操作内存单元,这就造成了指针的高效率

指针变量:

指针变量和指针常量

指针变量首先是一个变量,由于指针变量存储了某个变量的内存首地址,我们通常认为"指针变量指向了该变量",同时指针变量时一个变量,它的值是可以变动的。

相反,指针常量可通俗地理解为存储固定的内存单元地址编号的量,它一旦存储了某个内存地址以后,不可再改存储其他的内存地址了

举个例子:

void f(const int *x,int *y){*x=2;//错误,由于x前面有个const修饰,所以不可以修改x所指向的内存单元的内容//正确写法*y=3;}

指针变量和数组

先看一个例子:

int a[5]={1,2,3,4,5};int *ptr=(int*)(&a+1);cout<<*(a+1)<<endl;cout<<*(ptr-1)<<endl;

输出结果为2和5,首先我们看一下&a+1的含义:

分析:

上面的例子,只是通过简单的数据类型来说明内存分布,但是实际上一些复杂的数据类型,尤其是一些自定义的类或者结构体类型,内存分布还要充分考虑到字节对齐。

函数指针

函数指针是指向函数的指针变量,CC++程序在编译时,每个函数都有一个入口地址,该入口地址就是函数指针所指向的地址,有了指向函数的指针变量后,可用该指针变量调用函数,同时也可以做函数的参数

我们先看函数指针调用函数,如下:

int f(int x, int y) {return x + y;}//申明一个函数指针typedef int (*pf)(int, int);int main(){int a = 1;int b = 2;//将函数f地址赋给函数指针pfpf = f;//利用函数指针调用函数int c = (*pf)(a, b);cout << c << endl;}

需要注意的是,定义的函数指针类型时的函数签名(包括函数返回值和函数参数列表的类型,个数,顺序)要将赋值给该类型变量的函数签名保持一致,不然可能会发生很多无法预料的情况,还有CC++规定函数名就表示函数入口地址,所以,函数名赋值时函数名前面加不加取地址符&都一样,但是在C++中取类的方法函数的地址时,这个&符号不能省略。

函数指针还有另外一个用处,就是作为一个函数的参数,在Windows编程中作为回调函数很常见:

typedef int (*PF)(int, int);int f1(int x, int y){return x + y;}int f2(PF pf, int t){return (*pf)(3, t);}int main(){//将函数f1作为参数传递给函数f2int c = f2(f1, 4);cout << c << endl;return 0;}

C++中的引用

所谓引用,使用另外一个变量名来代表某一块内存,这就相当于同一个人有不同的名字,但是不管哪个名字,指的都是同一个人。

int a=1;//通过&符号,将b定义为a的引用int &b=a;//b和a完全一样,等价于int c=aint c=b;

注意,C++规定,定义一个引用的时候,必须马上初始化

传值还是传引用

如果变量类型是基元数据类型,比如int,float,bool,char等小数据类型被称为基元数据类型,那么赋值时传的是值,这时候b的值是a的拷贝,那么更改b不会影响到a,但是,如果变量数据类型是复杂数据类型,比如数组,类对象,那么赋值时传的就是引用,这个时候,a和b指向的都是同一个内存区域,那么无论更改a或者b都会相互影响。

最后,在利用C++中拷贝构造函数复制对象时需要注意,基元数据类型可以直接复制,但是对于引用类型数据,我们需要实现引用类型的真正复制

C++中的new关键词

在c++中通过new关键词定义一个对象,不能直接得到对象的实例,我们需要用一个指针去接收这个new出来的对象,我们引用这个对象必须使用指针引用运算符->

#include <iostream>using namespace std;class Person{public:Person(){}Person(int a, int b){this->m_a = a;this->m_b = b;}int m_a;int m_b;};int main(){//在C++中可以用以下形式来实例化一个对象,per1和per2为实例化的person类对象Person per1;int i = 1;int j = 2;Person per2(i, j);}

在C++中,this关键词是一个指针,而不像在java中是一个类实例,在C++中*this才等价于java

class Person{public:Person(int number){//C++中需要使用指针引用符号this->m_number = number;}//返回对象本身,,需要使用引用,因为返回值时会创建一个新的对象,使用引用的方式不会创建新的对象Person& getSelf(){return *this;}int m_number;};

关于“C++中指针实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯