C 为什么可以将指向int数组的未初始化指针赋值为变量';s值多少?

C 为什么可以将指向int数组的未初始化指针赋值为变量';s值多少?,c,pointers,C,Pointers,我已经阅读了一些问题的答案,比如,但是我仍然对改变指针的值有点困惑。有些评论似乎并不完全准确,或者可能是特定于实现的。(示例:a[1]与写入*(a+1)完全相同。显然,您可以写入*a=3,因为a是int*,所以您也可以写入*(a+1)=3,所以您也可以写入a[1]=3) 写入*a=3将产生一个警告:初始化将从整数生成指针,而不进行强制转换。还有一个断层 我的问题如下 int main(void) { int b = 5, c = 10; int *a = b; *a =

我已经阅读了一些问题的答案,比如,但是我仍然对改变指针的值有点困惑。有些评论似乎并不完全准确,或者可能是特定于实现的。(示例:
a[1]与写入*(a+1)完全相同。显然,您可以写入*a=3,因为a是int*,所以您也可以写入*(a+1)=3,所以您也可以写入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;
}
上面的示例将不起作用,并将产生segfault,但由于我不知道的某些原因,下面的示例将起作用

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;
}
int main(无效)
{
INTA[10],i;
对于(i=0;i<10;++i){
*(a+i)=i;/*假设与“*a=c;”的逻辑相同,但有效*/
}
对于(i=0;i<10;++i){
printf(“%d\n”,*(a+i));
}
返回0;
}
谢谢你的时间和努力

**编辑:谢谢您的回答,因为它是*a=&b(我知道这是(打字错误),但现在循环的第二个示例不清楚),数组索引被视为变量,而不是我假定的地址?

这:

int b = 5, c = 10;
int *a = b;
不起作用。你认为第二行的意思是:

int *a;
*a = b;
int *a;
a = b;
但事实并非如此。这意味着:

int *a;
*a = b;
int *a;
a = b;
上述错误意味着执行此操作时:

*a = c;

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

我知道它的意思是
a=b
。这只是简单的声明和赋值。问题是通过解引用a,并将c的值赋给其解引用(b),从而对a进行变异。@Byte:我已经扩展了我的答案。请看上面。我在问题中犯了一个小错误,我道歉。但是它使我的问题无效。
*
有三种不同的含义,这取决于它们使用的上下文。请参阅。不要忽略编译器警告。警告是错误,除非你能证明不是。讨论一个有编译错误的程序做什么是没有意义的不会发出警告。而且,
*a=3不会出现在您的代码中<代码>*a=c正确且不发出警告。我猜你写了
int*a=3*a=3不同。第二个例子有什么不清楚的地方?现在清楚了。谢谢@M.M