C 在指针上添加操作

C 在指针上添加操作,c,pointers,C,Pointers,这里指针变量j指向a[0],即90;a[0]is-20的地址在我的机器上。因此j保持-20。 a[1]的地址是-18。所以为了得到下一个变量,我应该使用*(j+2)。因为j+2将导致-18。但事实上,这种情况正在发生。访问a[1]。我必须使用*(j+1)。但是j+1=-19。为什么j+1会导致-18?地址是无符号的。您正在打印它们,就好像它们是int,但它们不是int。使用“%p”作为格式说明符。这就是打印指针地址的方式 此外,指针算法与您使用的算法不同。在内部,在指针p中添加一个将地址增加si

这里指针变量
j
指向
a[0]
,即90;
a[0]
is-20的地址在我的机器上。因此
j
保持-20。
a[1]
的地址是-18。所以为了得到下一个变量,我应该使用
*(j+2)
。因为
j+2
将导致-18。但事实上,这种情况正在发生。访问
a[1]
。我必须使用
*(j+1)
。但是
j+1=-19
。为什么
j+1
会导致-18?

地址是无符号的。您正在打印它们,就好像它们是
int
,但它们不是
int
。使用
“%p”
作为格式说明符。这就是打印指针地址的方式

此外,指针算法与您使用的算法不同。在内部,在指针
p
中添加一个将地址增加
sizeof*p
字节,即,它将地址增加到下一个对象


这很方便,因为程序员在对指针执行算术运算时,不必总是使用
sizeof
(实际上很少希望以
sizeof*p
以外的方式递增。当您这样做时,您首先将其转换为
char*

指针加法与简单加法不同

这取决于指针指向的变量类型

在您的例子中,它是一个int,其大小取决于机器(您可以检查是否执行sizeof(int))

因此,当向指针(如
(j+i)
添加一个数字时,它会在内部转换为
(j+i*sizeof(datatype))
,因此当您键入
(j+2)
时,地址会增加4倍(假设int为2个字节),这不是预期的结果


(j+1)
会给你正确的结果(就像说指向int类型数据的下一个元素)

实际上指针逻辑是基于指针类型工作的,因为整数指针类型在你的机器上按整数的大小移动,它在你的机器上移动2个字节,所以p+1=p+(指针类型))

*(x+y)
始终与
x[y]
(或
y[x]
)完全相等。因此,要打印
a[1]
,您需要
*(j+1)
(或仅
j[1]
)。请注意,在
a[1]
a
被转换为指针…处理
a
的方式与这里处理
j
的方式没有区别。

和a[0]的地址is-20…
-地址不会是负数…地址是无符号的。您为整数指针j分配了整数数组地址a的值,这是一个常量整数指针。a[0]相当于*(a+0),这显然是一个整数,而不是整数指针。
*(x+y)
完全等同于
x[y]
(或
y[x]
)。所以要打印
a[1]
,您需要
*(j+1)
(或只需
j[1]
)。
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));