2

如果我有一个像这样的指针:

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

这是为什么?地址不是无符号整数吗?如果是这样,那么指针指向的数据类型应该无关紧要。指针将始终存储一个无符号整数地址,因此它将占用 4 个字节。为什么短 int 指针占用 2 个字节,而 int 指针占用 4 个字节?最后,两个指针都只存储地址,不是吗?

4

5 回答 5

3

指针算术(即ptr+n)以所指向的事物为单位执行。

记住 thanptr+n等价于&ptr[n],所以它也等价于:

(T *)((char *)ptr + n*sizeof(T))

T你指向的任何类型在哪里。


顺便说一句,您应该使用%p来显示指针,而不是%#x.

于 2012-02-11T10:41:52.500 回答
1

如果你这样做

int* ptr;
printf("%#x\n%#x\n%#x\n", ptr, ptr+1, ptr+2);

编译器说“嘿,ptr指向一些int,程序员希望ints 在 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 ints 的偏移量分别为 1 和 2 个整数。所以,我得到sizeof(unsigned int)(在许多架构上,包括你的架构,2 个字节)并将其添加到ptr”。因此输出将偏移 2 个字节。

内存中的布局:

ptr --+
      |
      v
      +---------+---------+---------+
      |unsigned | unsigned|unsigned |
      +---------+---------+---------+
        2 bytes   2 bytes   2 bytes
于 2012-02-11T10:50:08.280 回答
0

你是对的,指针存储地址。但是,当您说时int* ptr,它会在内存中分配 4 个字节,因此任何新分配都不会触及该区域。同样,short 占用 2 个字节,因此它在内存中分配 2 个字节。

底线:指针存储所有数据类型共有的地址值,但容量各不相同

您可以阅读以下内容:http ://www.taranets.net/cgi/ts/1.37/ts.ws.pl?w=329;b=279

于 2012-02-11T10:47:31.547 回答
0

指针算术不同于通常的整数算术。编译器会记住 this 指针指向的变量类型的长度,并将这个长度添加到地址中,而不仅仅是数字 1、2 等等

于 2012-02-11T10:41:29.733 回答
0

是的指针是无符号整数,现在考虑定义int *ptr

ptr不代表指针的地址,它代表指针指向的变量的地址,大小将取决于它指向的变量的类型。如果你对指向任何类型的指针做了这样的事情printf("%x %x %x",&ptr,&ptr+1,&ptr+2),那么地址之间的区别将是相同的

于 2017-03-11T16:31:58.220 回答