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

时间:2015-10-14 04:49:01

标签: 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 memory         
}

有人可以解释一下如何将*ip的值打印为递增的内存位置。作为引用运算符的*ip应该返回地址右边的值吗?

2 个答案:

答案 0 :(得分:5)

我发现代码有两个问题。一个是这条线:

int *ip = x;

这会尝试将int的值赋给指针。这可以通过编译器标志强制执行,但应该给出错误。尽管如此,我怀疑这可能是你问题中的一个错字,因为取消引用2的地址几乎肯定会崩溃,但你声称它运行并产生了2的输出。我会假设你实际上有:

int *ip = &x;

第二个问题是:

ip++;

这里是递增指针,而不是它指向的int。我认为你的意图(增加2到3)将是:

(*ip)++;

也就是说,增加指针指向的值。

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

答案 1 :(得分:2)

此代码可能无法预测,因为

int *ip = x;

将x的值赋给指针。 基本上它硬编码2进入指针ip。

它可以编译并带有警告。 它可能会在运行时导致内存错误。