如果我有一个指针:
int* ptr;
我做了:
printf("%#x\n%#x\n%#x\n", ptr, ptr+1, ptr+2);
我得到的输出为:
some address
some address + 4bytes
some address + 8bytes
现在,如果我制作指针short int* ptr
我以与上面相同的方式打印并输出为:
some address
some address + 2bytes
some address + 4bytes
为什么?地址是无符号整数吗?如果是这样,那么指针指向的数据类型应该无关紧要。指针将始终存储一个无符号int的地址,因此它将占用4个字节。为什么短的int指针占用2字节而int指针占用4字节?最后,两个指针只存储地址,不是吗?
答案 0 :(得分:3)
指针arithemtic(即ptr+n
)以指向的东西为单位执行。
请记住,ptr+n
相当于&ptr[n]
,因此它也相当于:
(T *)((char *)ptr + n*sizeof(T))
其中T
是您指向的任何类型。
顺便说一句,您应该使用%p
来显示指针,而不是%#x
。
答案 1 :(得分:1)
如果你这样做
int* ptr;
printf("%#x\n%#x\n%#x\n", ptr, ptr+1, ptr+2);
编译器说"嘿,ptr
指向一些int
,程序员希望int
s的偏移量为1。 2整。所以,我得到sizeof(int)
(在许多架构上,包括你的4个字节)并将其添加到ptr
"的值。因此输出将偏移4个字节。
内存布局:
ptr --+
|
v
+---------+---------+---------+
| int | int | int |
+---------+---------+---------+
4 bytes 4 bytes 4 bytes
做的时候
unsigned int* ptr;
printf("%#x\n%#x\n%#x\n", ptr, ptr+1, ptr+2);
编译器说"嘿,ptr
指向一些unsigned int
,程序员希望unsigned int
s的偏移量为1。 2整。所以,我得到sizeof(unsigned int)
(在许多架构上,包括你的,2个字节)并将其添加到ptr
"的值。因此输出将偏移2个字节。
内存布局:
ptr --+
|
v
+---------+---------+---------+
|unsigned | unsigned|unsigned |
+---------+---------+---------+
2 bytes 2 bytes 2 bytes
答案 2 :(得分:0)
指针算术与通常的整数算术不同。编译器记住了这个指针所指向的变量类型的长度,并将该长度添加到地址,而不仅仅是数字1,2,依此类推
答案 3 :(得分:0)
你是对的,指针存储地址。但是当你说int* ptr
时,在内存中分配4个字节,这样任何新的分配都不会触及这个区域。类似地,short占用2个字节,因此它在内存中分配2个字节。
底线:指针存储所有数据类型通用的地址值,但容量不同
您可以阅读:http://www.taranets.net/cgi/ts/1.37/ts.ws.pl?w=329;b=279
答案 4 :(得分:0)
是指针是无符号整数,现在考虑定义int *ptr
ptr
不表示指针的地址,它表示指针指向的变量的地址,大小将取决于它指向的变量的类型。
如果你为指针指向任何类型printf("%x %x %x",&ptr,&ptr+1,&ptr+2)
而做了类似这样的事情,那么地址之间的差异将是相同的