C++中指针实例分析


这篇文章主要介绍“C++中指针实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中指针实例分析”文章能帮助大家解决问题。CPU是计算机的核心部件,要想让一个CPU工作,就必须向它提供指令和数据,指令和数据在存储器中存放,也就是我们平时说的内存。内存分为:物理内存和虚拟内存,物理内存对应着计算机中的内存条,虚拟内存是操作系统内存管理系统假想出来的,由于这些不是我们本文的重点,我们就不做区分。在不考虑cpu缓存的情况下 香港云主机,计算机运行程序本质上是对内存中的数据的操作,存储器被划分为多个存储单元,存储单元从零开始顺序编号,CPU要从内存中读取数据,首先要指定存储单元的地址。CPU从内存中读取数据的过程如图所示:计算机为了方便管理内存,将内存的每个单元用一个数字编号指针的本意就是内存地址,我们可以通俗的理解成内存编号,既然计算机通过编号来操作内存单元,这就造成了指针的高效率指针变量:通俗理解为存储指针的变量,也就是存储内存地址(内存编号)的变量指针变量和int,float,char等类型一样同属变量类型,指针变量类型占四个字节(32位机器下),存储的是32位的内存地址
星号:在CC++中(*)被定义为取内容符号虽然所有指针变量占的内存大小和存储的内存地址大小都是一样的,但是由于存储的只是数据的内存首地址,所以指针变量存储的内存地址所指向的数据类型决定着如何解析这个首地址比如int型指针变量,我们需要从该指针变量存储的首地址开始向后一直搜索4个字节的内存空间所以当我们使用*p,必须知道p是一个什么类型的指针
指针变量首先是一个变量,由于指针变量存储了某个变量的内存首地址,我们通常认为”指针变量指向了该变量”,同时指针变量时一个变量,它的值是可以变动的。相反,指针常量可通俗地理解为存储固定的内存单元地址编号的量,它一旦存储了某个内存地址以后,不可再改存储其他的内存地址了举个例子:先看一个例子:输出结果为2和5,首先我们看一下&a+1的含义:我们知道CC++中规定数组名表示这个数组的首地址,而这里出现了&a这样的符号,本来a就是指针常量,再次取地址难道不是非法操作?这时我们可以将这个&a看成是指向数组的指针,也称为行指针,&a的类型是int (*p)[5],一个步长即5个元素的长度,&a + 1代表往后移动一个步长
分析:a表示的是第一个元素的首地址,那么a+1指向的就是下一个元素的内存首地址,所以*(a+1)=2而&a则表示整个数据的首地址,那么&a+1移动的内存数目就是整个数组所占字节数,假如原先数组中第一个元素的首地址是0,那么&a+1表示的就是20,而这个地址已经不属于数组了,接着通过(int*)(&a+1)将数组指针转换成整型指针,这样原先&a+1表示的数据范围20-39就缩小为20-23,正好是一个int型的大小,而ptr-1就是16了,表示的数据内存范围是16-19,这样*(ptr-1)正好是最后一个元素5了
上面的例子,只是通过简单的数据类型来说明内存分布,但是实际上一些复杂的数据类型,尤其是一些自定义的类或者结构体类型,内存分布还要充分考虑到字节对齐。函数指针是指向函数的指针变量,CC++程序在编译时,每个函数都有一个入口地址,该入口地址就是函数指针所指向的地址,有了指向函数的指针变量后,可用该指针变量调用函数,同时也可以做函数的参数我们先看函数指针调用函数,如下:需要注意的是,定义的函数指针类型时的函数签名(包括函数返回值和函数参数列表的类型,个数,顺序)要将赋值给该类型变量的函数签名保持一致,不然可能会发生很多无法预料的情况,还有CC++规定函数名就表示函数入口地址,所以,函数名赋值时函数名前面加不加取地址符&都一样,但是在C++中取类的方法函数的地址时,这个&符号不能省略。函数指针还有另外一个用处,就是作为一个函数的参数,在Windows编程中作为回调函数很常见:所谓引用,使用另外一个变量名来代表某一块内存,这就相当于同一个人有不同的名字,但是不管哪个名字,指的都是同一个人。注意,C++规定,定义一个引用的时候,必须马上初始化如果变量类型是基元数据类型,比如int,float,bool,char等小数据类型被称为基元数据类型,那么赋值时传的是值,这时候b的值是a的拷贝,那么更改b不会影响到a,但是,如果变量数据类型是复杂数据类型,比如数组,类对象,那么赋值时传的就是引用,这个时候,a和b指向的都是同一个内存区域,那么无论更改a或者b都会相互影响。最后,在利用C++中拷贝构造函数复制对象时需要注意,基元数据类型可以直接复制,但是对于引用类型数据,我们需要实现引用类型的真正复制在c++中通过new关键词定义一个对象,不能直接得到对象的实例,我们需要用一个指针去接收这个new出来的对象,我们引用这个对象必须使用指针引用运算符->在C++中,this关键词是一个指针,而不像在java中是一个类实例,在C++中*this才等价于java关于“C++中指针实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注开发云行业资讯频道,小编每天都会为大家更新不同的知识点。

相关推荐: 浏览器打开网站已完毕但网页上有错误怎么办

这篇文章将为大家详细讲解有关浏览器打开网站已完毕但网页上有错误怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、点击开始菜单中的运行,在运行窗口中输入regsvr32 jscript.dll,然后按回车。2、再次打开运…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 07/14 16:30
下一篇 07/14 16:30

相关推荐