C/C++新人杀手问题:一个指针的大小是多少?

作者: HexUp分类: 计算机技术 发布时间: 2022-09-18 10:30:00 浏览:44366 次

C/C++新人杀手问题:一个指针的大小是多少?

锁链镐:
有个问题,如果我在64位的计算机上运行一个32位的程序,计算机是会模拟出一个32位的环境还是把32位的内存地址对应到64位的地址上[tv_白眼]

【回复】32位兼容cpu会开兼容模式运行,然后操作系统会将动态库重定向到32位版本,这样就跟32位环境一毛一样了
【回复】回复 @RenYz :Windows上弄了个WOW64文件夹,应该就是搞这个的
666yush:
c++本身并没有规定指针大小,所有假定指针大小的行为都是ub。想要获取指针大小,请用intptr_t(意思即为字面意思

【回复】关于c/c++的教学牛鬼蛇神真是太多了,完全误人子弟。c/c++不是汇编,对于机器有着很高的抽象,他们的指针不是能任意操作的,其拥有的限制一点不比现代编程语言少。
【回复】回复 @叩龙家口头禅 :看了评论,科普任重而道远,纠正牛鬼蛇神的教学需要付出的精力比他们随口一说要多太多太多了[热]
【回复】回复 @666yush :感觉或许激进了,从常规情况上来看up说得并没有错。并且最后也补充了,是由具体情况其实是由编译器决定的,所以对于新手教学算是非常友好。一上来就一个ub,刚入门的人从哪儿知道C/C++标准,更别说去读了
魂予守望:
简单而言,夹在所有“书页”之间的“书签”的大小和形状都应该是一样的(别刚

Ex_M:
现在都是最大的通用寄存器有多大就是指针大小,不过对新手来说不太好理解[doge]

吃里扒外骚达奴:
如果是八字节大小的指针,可是电脑只有16gb,那指针的地址如果大于16gb该怎么表示呢,所以都会编译成32位的程序?

【回复】前面讲得都是错的。 实际内存大小和指针没有关系,指针是c标准描述机器中的概念,真实机器必须支持这个概念机器的执行。 像你这个问题,程序指针大小或者虚拟内存地址空间大小和实际内存多少没有关系,直到你访问一个没有的内存时,它会产生一个缺页异常,然后把一片实际内存对应到你这个虚拟地址上。
【回复】8字节的内存地址也是相当利害的了 8*8 = 64-bit,10bit = 1KB,20bit=1MB,30bit=1GB。。。
【回复】回复 @zqvqzZZ : 确实错了, 程序编译指针指向的是相对地址,运行时操作系统分配的是逻辑地址,与实际内存物理地址之间还需要进行一次转换 ,貌似是这个流程
问之雨:
[吃瓜]学过汇编应该很好理解指针,指针大小和偏移地址寄存器的大小是相等的。

【回复】那可不对,8086 的机器字长是 16bit 的,也就是寄存器是 16bit 的,但地址总线却是 20bit的,所以指针变量的尺寸需要 32 bit 才能存储下 20bit 的地址。
南国的游子:
8位的8051的C编译器,对于指定存储区域的指针,是2字节的。对于不指定存储区域的,是3字节的,因为需要额外1字节指定存储区域

温泉柠檬冰:
请问一下对于数组用指针进行表示时,为什么加1就是下一个数据,而不是加这个数据类型所占的内存呀?

【回复】因为知道指针类型,编译器会帮你计算需要移动几个字节
basakamars:
就如标题,你知道大小用来干什么?有能力改变这大小吗?编程都是在应用层面的,知道个大小有什么用?

【回复】暴露出你菜了,你不知道地址大小。结构体你怎么对齐?你要存数据,你怎么知道要写入几个字节
【回复】这是c语言教程不是面向对象语言教程[热]。
【回复】说明你菜的抠脚而且没写过稍微大点的程序
saturnman123:
指针只是一种逻辑抽象,标准真的没有规定指向任何对象的指针大小相同,比如一般的编译器会让指向类成员函数指针比普通指针大一倍,但也不是绝对的。C++一定要从逻辑上去理解,不然它不可能兼容如此多的如此奇怪多样的硬件类型。

大污私:
你可以再深入说说,不同类型的指针他们“不同”的本质是什么

【回复】不同数据类型的指针他们进行移位操作的时候,移动1位的距离就是该数据类型所占空间大小啊,这不是基本操作吗。
【回复】从指向地址连续读取的内存个数,char就读一个,int就连续读四个。
【回复】回复 @XClaymoreX : 指针又不只是对象指针。
混迹者X:
一个32位程序运行在内存大于4G的运行64位操作系统的环境里,假设此时机器的前4G内存都已被占用,那么此时这个32位程序是否就会无法运行?还是操作系统会以某一个地址为初始地址0,使得程序可以访问4G内存之后的内存地址,让程序可以运行?

【回复】物理内存由操作系统分页管理,应用程序使用的都是虚拟内存空间,实际只在物理内存占有对应的页
【回复】操作系统中得内存叫虚拟内存 跟你物理内存不是一个东西 早期xp时代得时候 家用机器大多物理内存只有1GB 2GB 但是虚拟内存任然是4GB 32位得程序 不管是32位系统 还是在64位系统 他得虚拟内存都是4g 所以你采用正常得操作得 你是没有办法访问到4GB以外得数据
【回复】每个进程的地址空间都是独立的

计算机 视频教程 新人 编程 指针 C/C++ c++ 编程开发 B选公开课创作激励计划 B站讲台等你来

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!