ptr
具有地址1000:2000
码
int ptr[2];
printf("%p %p %p",&ptr+1,ptr+1,ptr);
上述代码的输出是什么?
我尝试了什么:
由于我不知道如何解释/转换1000:2000
到一个地址,我尝试手动。
我通过将ptr
的地址视为10000+2000=12000
来尝试此操作
所以,&ptr=12000
和&ptr+1=12000+sizeof(int)
ptr
是指向的第一个元素的地址,类似地ptr+1
是第二个元素的地址
这是对的吗?
我该怎么测试呢?
答案 0 :(得分:1)
如果您知道类型,这是简单的指针算术。
int ptr[2];
printf("%p %p %p",&ptr+1,ptr+1,ptr);
ptr
是数组的名称,它衰减到指向第一个元素的指针。如果它是一本旧书,那就是1000:2000
。
因此ptr+1
是一个元素,因此,如果int
的大小为4,1000:2004
。 (本书中可能int
的大小为2,因此它为1000:2002
。)
&ptr
是指向数组的指针。它指向同一个地方 - 1000:2000
- ,但指向更大的项目:两倍大。所以加1,结果增加了两个整数的大小,因此8 resp 4.所以&ptr+1
得到1000:2008
resp。 1000:2004
作为答案。
答案 1 :(得分:1)
+-------------------------------------+
|{ ptr[0] ptr[1] } {ptr1[0],ptr1[1]} |
| ^ ^ ^ |
| | | | |
| ptr ptr+1 | |
| | | |
| &ptr &ptr+1 |
+-------------------------------------+
很容易理解ptr
指针指向此数组的第一个地址项,ptr+1
指针指向第二个数组项。 &ptr
,它是int array[2]
int是int (*x)[2]
的指针点,因此& ptr +1表示地址移动int array[2]
。
这是一个测试代码:
#include <stdio.h>
int main()
{
int ptr[2];
int i;
for (i =0; i <3; ++i)
printf("ptr + %d is : %p\n",i,&(ptr[i]));
printf("\n&ptr +1 : %p\nptr+1 : %p\nptr : %p\n",&ptr+1,ptr+1,ptr);
}
屏幕打印
ptr + 0 is : 0xbf892614 <---the same as ptr base address
ptr + 1 is : 0xbf892618 <---the same as prt+1 4 byte add
ptr + 2 is : 0xbf89261c < --the same as &ptr +1 4 byte add
&prt +1 : 0xbf89261c
ptr+1 : 0xbf892618
ptr : 0xbf892614