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