c语言中的输出问题
c语言中的输出问题,c,output,C,Output,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是第二个元素的地址 是这样吗? 我如何测试它?如果你知
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
是第二个元素的地址是这样吗?
我如何测试它?如果你知道类型,这是简单的指针算法
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和4。所以&ptr+1
让你1000:2008
resp<代码>1000:2004作为答案
+-------------------------------------+
|{ ptr[0] ptr[1] } {ptr1[0],ptr1[1]} |
| ^ ^ ^ |
| | | | |
| ptr ptr+1 | |
| | | |
| &ptr &ptr+1 |
+-------------------------------------+
很容易理解ptr
指针是这个数组的第一个地址项,ptr+1
指针是数组的第二个地址项&ptr
,它是一个指针点aint数组[2]
int是一个int(*x)[2]
,因此&ptr+1表示地址移动aint数组[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);
}
#包括
int main()
{
int-ptr[2];
int i;
对于(i=0;i“如何测试?”-运行它怎么样?第二个和第三个参数应该是0,因为它们被初始化为0。第一个参数应该只是数组中第一个项目的地址+1@NoIdeaForNameptr是一种array@boxed__l是的…数组是C++中的指针,我的朋友读:PTR被假定为PTR的地址或PTR指向的地址:1000:@它们都是盒装的。ptr
不是指针,而是数组。所以ptr
和&ptr
指向同一个位置,但有不同的类型。毫无疑问,在汇编语言或其他语言中,我们不是像我那样添加地址以获得实际的内存地址吗expain@boxed__l我不知道你到底是什么意思。你是说将段:偏移量
转换为段*10+偏移量
?这就是我在DOS/Real模式下的意思。现在在PC上,地址仅为32或64位数字。之所以被接受,是因为“一张图片抵得上千言万语”
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