指针长度和地址总线有关。因为指针记录的就是一个地址,那么32位的就是4字节,64位的就是8字节,
也正是地址总线的意义所在.
vs2013 community 编译
#include <stdio.h>
#include <stdlib.h>
void main()
{
double hoge = 5;
double piyo = 10;
int *hoge_p;
int *hoge_p2;
printf("&hoge....%p\n", &hoge);
printf("&hoge地址加1; %p\n", &hoge + 1);
printf("&piyo; %p\n", &piyo);
printf("&hoge_p....%p\n", &hoge_p);
printf("&hoge_p2....%p\n", &hoge_p2);
printf("length....%d\n", sizeof(int));
hoge_p = (int*)&hoge;
printf("afeter valued ,hoge_p....%p\n", hoge_p);
system("pause");
}
结果:
&hoge....008FFB20
&hoge地址加1; 008FFB28
&piyo; 008FFB10
&hoge_p....008FFB04
&hoge_p2....008FFAF8
length....4
afeter valued ,hoge_p....008FFB20
请按任意键继续. . .
总结:
1.int *hoge_p,表示声明指向int类型的指针hoge_p
2.int类型地址加1,地址值加4;double类型地址加1,地址值加8。这是因为,对指针进行加1运算,地址的值会增加当前指针所指向数据类型的长度。
3,(int*),强制转化hoge的地址为int型,这样hoge_p的值才能赋值。
指针hoge_p的值
(图片,来自《征服C指针》)
即,声明指针时,hoge_p会分配一个地址 008FFB04 (win32,所以是32位地址,若改成x64模式,就是64位地址)
且此地址紧挨着int 变量 hoge和piyo的地址;
对类型的声明,int 和double一个是4字节(利用sizeof(int)查看),一个是8字节,那么其地址空间长度也不一样。(1字节占8个二进制位)
由结果可知,double类型的piyo和hoge地址值相差16个字节(寻址的最小单位是字节,即每一个字节有一个地址),而double只占8个字节。那么中间就相当于隔了两个double长度
int *类型的hoge_p和hoge_p2地址值相差12,一个int是4个字节,就相当于隔了3个int,至于为什么不是1,这个我也不是很清楚
(后面查询了,是如下原因:
debug模式下,每个变量之间都有些填充,double填充了1个,int填充了两个。release下没有。但也没有规定说i1,i2,i3必须是连续的)
hoge_p = (int*)&hoge;通过取hoge的地址,为hoge_p赋值,hoge_p=008FFB20;
即指针变量其
地址为:008FFB04
其值为:008FFB20
同时,值得注意的是因为 int *hoge_p,其实声明的是指向int类型的指针变量hoge_p,所以,类型要对应
double hoge=5;
int *hoge_p;
hoge_p=&hoge;
是会报错的。