C中的指针数据类型



如果我有一个类似的指针

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,程序员希望ints的偏移量分别为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)做了这样的操作,那么地址之间的差异将是相同的

相关内容

  • 没有找到相关文章

最新更新