以下代码
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
应该返回地址右边的值吗?
答案 0 :(得分:5)
我发现代码有两个问题。一个是这条线:
int *ip = x;
这会尝试将int的值赋给指针。这可以通过编译器标志强制执行,但应该给出错误。尽管如此,我怀疑这可能是你问题中的一个错字,因为取消引用2的地址几乎肯定会崩溃,但你声称它运行并产生了2的输出。我会假设你实际上有:
int *ip = &x;
第二个问题是:
ip++;
这里是递增指针,而不是它指向的int。我认为你的意图(增加2到3)将是:
(*ip)++;
也就是说,增加指针指向的值。
如果递增指针,它现在指向堆栈上的其他位置,可能是另一个局部变量(如指针本身),或返回地址,或堆栈帧指针,或其他一些隐藏值。新值很可能是某种指针,其值类似于指针的地址,否则看起来像打印指针的输出。当然,您不应该增加指向单个元素的指针。这绝不是一个好主意。
答案 1 :(得分:2)
此代码可能无法预测,因为
int *ip = x;
将x的值赋给指针。 基本上它硬编码2进入指针ip。
它可以编译并带有警告。 它可能会在运行时导致内存错误。