|
发表于 2016-4-7 15:46:04
|
显示全部楼层
本帖最后由 muyu0096 于 2016-4-7 15:49 编辑
你弄混了这2个概念:指针变量本身的大小,和指针指向的变量(即该类型)的大小。
前者主要是受到内存随机寻址的限制。具体的说,对于32位的系统,他能表示0到2的32次方个自然数(大概4G),因此寻址范围也就是 [0,4G],因此指针变量本身的大小就是2 的32次方--即4字节,因为它要能表示在这个范围内的任意一个数。
同样的道理,对于64位系统,指针变量本身的大小是8字节。
而指针指向对象的大小,取决于指向对象的类型,这个类型具体多大,一般取决于编译器,比如float,有的编译器是4字节,有的是8字节。
至于指针加减法,实际上是加上或者减去n个同类型的地址的大小。
sizeof也是如此,取的是该类型的大小。
所以,sizeof(float)在有的编译器上是4,有的是8.
但无论是哪种编译器,在32位机器上,sizeof(float*)一定是4,同样的sizeof(int*)=sizeof(double*)=sizeof(char*)=4-----注意:这里的类型是各种 float指针,int指针,。。指针本身也是一种变量类型.
但在64位系统里,他们都等于8
引申的复杂些,还可以对数组,甚至多维数组进行指针加减法,但无论如何,本质是看加减的层级是哪个类型。
|
|