C语言中指针变量的大小及系统差异问题
C语言中指针变量的大小及系统差异问题
嘿,这个问题问到点子上了,很多刚学指针的朋友都会被这个点绕晕,我来给你掰扯清楚~
首先核心结论:指针变量的大小只取决于你的系统架构(也就是CPU的地址总线宽度),和它指向的变量类型半毛钱关系都没有!
为啥呢?因为指针的本质就是存储内存单元的地址,不管你指向的是占2字节的short、4字节的int还是8字节的double,地址本身的长度只看系统能支持多大的寻址范围:
- 比如常见的64位笔记本/PC,地址总线是64位,所以指针大小就是8字节(1字节=8位,64位=8字节);
- 而那些小型嵌入式控制器,比如8位单片机,地址总线可能只有16位,那指针大小就是2字节;要是更老的32位嵌入式系统,指针就是4字节。
所以回到你的问题:笔记本(一般64位)和嵌入式控制器(多为32位/16位/8位)的指针大小肯定不一样,完全跟着系统的寻址能力走。
咱们再结合你给出的代码来验证:
#include <stdio.h> int main(void){ short int a = 9; short int *p1=&a; double b = 10; double *p2=&b; printf("Size of integer = %d\n",sizeof(*p1)); printf("Size of double = %d\n",sizeof(*p2)); printf("Size of integer pointer = %d\n",sizeof(p1)); printf("Size of double pointer = %d\n",sizeof(p2)); printf("Value of integer pointer = %x\n",p1); printf("Value of double pointer = %x", p2); }
如果在64位系统上运行,输出会是这样:
Size of integer = 2 Size of double = 8 Size of integer pointer = 8 Size of double pointer = 8 Value of integer pointer = 7ffee3b5aabc Value of double pointer = 7ffee3b5aab0
咱们拆解下输出:
sizeof(*p1)取的是指针指向的变量a的大小,short int占2字节,所以输出2;sizeof(*p2)是double类型的大小,8字节;- 重点看
sizeof(p1)和sizeof(p2),都是8字节——这就印证了咱们的结论:不管指针指向什么类型,同一系统下指针大小完全相同。
要是把这段代码放到一个32位的嵌入式系统上跑,那两个指针的大小就会变成4字节,指向的变量大小还是2和8,不会变。
备注:内容来源于stack exchange,提问作者Deep Vinod Lad
相关产品推荐
相关产品推荐

