如果我有一个类似的指针
int* ptr;
我做:
printf("%#xn%#xn%#xn", 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字节?最后,两个指针都只存储地址,不是吗?
指针算术(即ptr+n
)是以被指向的对象为单位执行的
记住,ptr+n
等价于&ptr[n]
,所以它也等价于:
(T *)((char *)ptr + n*sizeof(T))
其中T
是您指向的任何类型。
顺便说一下,应该使用%p
来显示指针,而不是%#x
如果进行
int* ptr;
printf("%#xn%#xn%#xn", ptr, ptr+1, ptr+2);
编译器说:"嘿,ptr
指向一些int
,程序员希望int
s的偏移量分别为1和2 int。所以,我得到sizeof(int)
(它在许多体系结构上,包括你的4字节),并将其添加到ptr
的值中"。因此输出将偏移4个字节。
内存布局:
ptr --+
|
v
+---------+---------+---------+
| int | int | int |
+---------+---------+---------+
4 bytes 4 bytes 4 bytes
进行时
unsigned int* ptr;
printf("%#xn%#xn%#xn", ptr, ptr+1, ptr+2);
编译器说:"嘿,ptr
指向一些unsigned int
,程序员希望unsigned int
的偏移量分别为1和2 int。所以,我得到sizeof(unsigned int)
(它在许多体系结构上,包括你的2字节),并将其添加到ptr
的值中"。因此输出将偏移2个字节。
内存布局:
ptr --+
|
v
+---------+---------+---------+
|unsigned | unsigned|unsigned |
+---------+---------+---------+
2 bytes 2 bytes 2 bytes
指针算法不同于通常的整数算法。编译器考虑到这个指针指向的变量类型的长度,并将这个长度添加到地址中,而不仅仅是上的数字1、2等等。
没错,指针存储地址。但是,当您说int* ptr
时,它会在内存中分配4个字节,因此任何新的分配都不会触及此区域。类似地,short占用2个字节,因此它在内存中分配2个字节。
底线:指针存储所有数据类型通用的地址值,但的容量各不相同
您可以阅读以下内容:http://www.taranets.net/cgi/ts/1.37/ts.ws.pl?w=329;b=279
yes指针是无符号整数,现在考虑定义int *ptr
ptr
不代表指针的地址,它代表指针所指向的变量的地址,大小将取决于指针所指向变量的类型。如果你对指向任何类型的指针printf("%x %x %x",&ptr,&ptr+1,&ptr+2)
做了这样的操作,那么地址之间的差异将是相同的