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));