int a[3];
int *j;
a[0]=90;
a[1]=91;
a[2]=92;
j=a;
printf("%d",*j);
printf("%d",&a[0])
printf("%d",&a[1]);
printf("%d",*(j+2));
此处指针变量j
指向a[0]
,为90; a[0]
的地址为-20在我的计算机上。所以j
持有-20。
a[1]
的地址是-18。因此,要获得下一个变量,我应该使用*(j+2)
。因为j+2
会导致-18。但这实际上正在进行中。访问a[1]
。我必须使用*(j+1)
。但是j+1=-19
。为什么j+1
导致-18?
答案 0 :(得分:3)
地址是未签名的。您将它们打印为int
,但它们不是int
。使用"%p"
作为格式说明符。这就是你打印指针地址的方式。
此外,指针算法与您习惯的算法不同。在内部,向指针p
添加一个会使地址增加sizeof *p
个字节,即,它会增加到下一个对象。
这很方便,因为它节省了程序员在对指针执行算术时不必总是使用sizeof
(很少你实际上想要通过sizeof *p
之外的其他东西来增加。当你这样做时,你首先转为char*
。)
答案 1 :(得分:0)
指针添加与简单添加不同。
这取决于指针指向的变量类型。
在你的情况下,它是一个int,其大小取决于机器(你可以检查sizeof(int))。
因此,当向(j+i)
之类的指针添加数字时,它会在内部转换为(j+i*sizeof(datatype))
,因此当您键入(j+2)
时,地址会增加4倍(假设int为2个字节)不是预期的结果。
(j+1)
将为您提供正确的结果(它就像是指向int类型数据的下一个元素)
答案 2 :(得分:0)
实际上指针逻辑在指针类型的基础上工作,因为整数指针类型在你的机器上按整数大小移动它在你的机器上移动2个字节所以p + 1 = p +(sizeof(指针类型))
答案 3 :(得分:0)
*(x+y)
始终完全等同于x[y]
(或y[x]
)。因此,要打印a[1]
,您需要*(j + 1)
(或仅j[1]
)。请注意,在a[1]
中,a
转换为指针...处理a
的方式与此处处理j
的方式没有区别。