C 打印为所指向变量地址的*ip值

C 打印为所指向变量地址的*ip值,c,pointers,C,Pointers,对于下面的代码 int main() { int x = 2; int *ip = &x; printf("%d",*ip); // Printing the value of *ip gives 2 //Now if the value of ip is incremented ip++; printf("%d",*ip); //Printing the value of *ip gives the incremented m

对于下面的代码

int main()
{
  int x = 2;
  int *ip = &x;
  printf("%d",*ip); // Printing the value of *ip gives 2
                    //Now if the value of ip is incremented
  ip++;
  printf("%d",*ip); //Printing the value of *ip gives the incremented memory         
}

有人能解释一下
*ip
的值是如何作为递增的内存位置打印出来的吗
*ip
作为延迟运算符应返回地址右侧的值?

此代码的行为可能不可预测,因为

int *ip = x;
将x的值指定给指针。 基本上,它将2硬编码到指针ip中

它可能会编译时出现警告。
以后可能会在运行时导致内存错误。

我发现代码有两个地方出错。一个是线路:

int *ip = x;
这试图将int的值分配给指针。可以使用编译器标志强制执行此操作,但应给出一个错误。尽管如此,我怀疑这可能是您的问题中的一个输入错误,因为取消对地址2的引用几乎肯定会崩溃,但您声称它运行并产生了输出2。我假设你实际上有:

int *ip = &x;
第二个问题是:

ip++;
在这里,您将递增指针,而不是指针指向的int。我认为您打算(增加2到3)的是:

(*ip)++;
也就是说,增加指针指向的值


如果递增指针,它现在将指向堆栈上的其他地方,可能是另一个局部变量(如指针本身)、返回地址、堆栈帧指针或其他隐藏值。新值很有可能是某种类型的指针,其值与指针地址类似,或者看起来像打印指针的输出。当然,您不应该递增指向单个元素的指针。这从来都不是一个好主意。

启用所有编译器警告,看看这是否有用。您是想执行
(*ip)+
?我假设您希望通过指针递增
x
,而不是递增指针。int*ip=x实际上意味着,将ip声明为指向int的指针,并将x(作为int)的值分配给ip(指向int的指针)。是的,看起来应该是
int*ip=&x您好发布问题时出错。。它应该是&x而不是xHi,我为这个小故障感到抱歉,我已经更正了这一行,它是&x而不是x,你现在可以看看这个问题了吗?是的,它解决了第一个问题。正如丹尼尔·史蒂文斯所解释的,它还有第二个问题。代码正在递增ip,现在它指向堆栈上代码本身未分配的位置。因此,它会打印出发生在那里的任何东西,这是一种不可预测的行为。嗨,对于第一部分,我很抱歉这个问题被错误地打印出来,它应该是&x而不是x,谢谢你的更正。对于您提到的第二个问题,*ip++也可以像(*ip)++,问题是关联性。对于(*ip)++没有问题,因为内存位置中包含的值(如ip所指)是递增的。我尝试使用*ip++查看结果,发现这次打印的值是递增的内存位置,但是该位置没有值。简言之,指针ip指向未初始化的整数位置