我已经阅读过诸如why a pointer can be assigned value?之类的问题的答案,但是我仍然对改变指针的值感到困惑。有些评论似乎并不完全准确,或者可能是特定的实施。 (例如:a[1] is exactly the same as writing *(a + 1). Obviously you can write *a = 3 since a is int*, so you can also write *(a + 1) = 3, so you can also write a[1] = 3
)。
写*a = 3
会产生一个警告:初始化使得整数指针没有强制转换。以及段错误。
我的问题如下。
int main(void)
{
int b = 5, c = 10;
int *a = b;
*a = c; /* Will not work. (Should technically change the value of b to 10, leaving the pointer still pointing to b.) */
printf("%d\n", *a);
return 0;
}
上面的示例不起作用,并且会产生段错误,但由于某些原因我不知道以下情况。
int main(void)
{
int a[10], i;
for (i = 0; i < 10; ++i) {
*(a + i) = i; /* Supposedly the same logic as '*a = c;', but works*/
}
for (i = 0; i < 10; ++i) {
printf("%d\n", *(a + i));
}
return 0;
}
感谢您的时间和努力。
**编辑:谢谢你的答案,因为它是* a =&amp; b(我知道这个(错字),但现在第二个带循环的例子不清楚),数组索引被视为变量,不是我认为的地址吗?
答案 0 :(得分:3)
此:
int b = 5, c = 10;
int *a = b;
不起作用。你认为第二行意味着:
int *a;
*a = b;
但它没有。这意味着:
int *a;
a = b;
上述错误意味着当您执行此操作时:
*a = c;
您的程序崩溃(或者可能没有,未定义的行为!),因为a
是一个无效指针(它指向地址5,这在很多方面都是错误的。)