为什么可以为int数组指定未初始化的指针给变量的值?

时间:2016-05-10 04:32:11

标签: c pointers

我已经阅读过诸如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(我知道这个(错字),但现在第二个带循环的例子不清楚),数组索引被视为变量,不是我认为的地址吗?

1 个答案:

答案 0 :(得分:3)

此:

int b = 5, c = 10;
int *a = b;

不起作用。你认为第二行意味着:

int *a;
*a = b;

但它没有。这意味着:

int *a;
a = b;

上述错误意味着当您执行此操作时:

*a = c;

您的程序崩溃(或者可能没有,未定义的行为!),因为a是一个无效指针(它指向地址5,这在很多方面都是错误的。)