C中的指针数据类型

时间:2012-02-11 10:38:52

标签: c pointers pointer-arithmetic

如果我有一个指针:

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字节?最后,两个指针只存储地址,不是吗?

5 个答案:

答案 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)而做了类似这样的事情,那么地址之间的差异将是相同的