• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c++指针空间大小的决定因素

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在学习apue的11.5 Threads时,有一个实例代码,其中有一个打印地址fp的语句printf(" structure at 0x%lx\n", (unsigned long)fp);为什么要将指针变量fp强制转换为unsigned long再打印呢,(为了兼容unix的各种分支平台)以前学习c语言的经验是指针变量占用空间大小是4个字节,查阅资料后发现:

void
printfoo(const char *s, const struct foo *fp)
{
printf("%s", s);
printf(" structure at 0x%lx\n", (unsigned long)fp);
printf(" foo.a = %d\n", fp->a);
printf(" foo.b = %d\n", fp->b);
printf(" foo.c = %d\n", fp->c);
printf(" foo.d = %d\n", fp->d);
}

 指针的空间大小没有固定的值,它取决于体系结构、编译器实现、指针的类型(指向不同类型变量的指针不一定有相同的空间大小或表示方法)

例如,假设有一个word-addressed architecture,where最小的存储地址单元是16位,每一个字可以存储多个char类型的变量,所有其他类型占据一整个字或者多个字,在这样的体系结构中,一个指针型的变量可能需要一些额外的位表示字里面的偏移量

还有就是一个指针类型的变量的位数可能比实际上需要的用来存储一个地址的位数多,最初是的运行在Motorola 68000CPU上的Macintosh系统的字大小为32位,但是仅有24位属于地址总线,指针类型是32位宽,其中有8个位没有使用,MacOS程序员利用了这个特性来存储一些数据,利用一个指针类型的高字节地址,充分利用了宝贵的128字节的随机访问存储空间,后来Motorola最终发布了一个32位地址线的CPU,意味着那些代码需要重写。

C99提供了intptr_t和uintptr_t类型,是整数,并且保证足够宽以满足存放一个指针变量。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
在C/C++中常用的符号发布时间:2022-07-14
下一篇:
C#的隐式类型、匿名类型、自动属性、初始化器发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap