C 为什么可以';我们是否使用数组名的间接运算符?
在下面的代码中,为什么我不能取消对数组名称的引用,因为当数组作为参数传递给函数时,它将成为指向数组第一个元素的指针,那么为什么我们不能取消对它的引用呢C 为什么可以';我们是否使用数组名的间接运算符?,c,C,在下面的代码中,为什么我不能取消对数组名称的引用,因为当数组作为参数传递给函数时,它将成为指向数组第一个元素的指针,那么为什么我们不能取消对它的引用呢 #include <stdio.h> int main(void) { char s[] = "radha"; int a[2] = {0,1}; printf("%s ", *s); printf("%d", *a); return 0; } #包括 内部主(空){ 字符s[]=“radh
#include <stdio.h>
int main(void) {
char s[] = "radha";
int a[2] = {0,1};
printf("%s ", *s);
printf("%d", *a);
return 0;
}
#包括
内部主(空){
字符s[]=“radha”;
int a[2]={0,1};
printf(“%s”,*s);
printf(“%d”,*a);
返回0;
}
我在上面的代码中遇到了分段错误,原因是什么,当我使用[0]时,它在内部转换为*(a+0),因此简单地执行*a或*s有什么问题,请澄清。
printf(“%s”、*s)当您传递char'r'
时,code>希望第二个参数是字符串指针(取消引用s
将按预期提供第一个数组项)。我对您的
阅读文档
“%s”
说明符需要一个char
指针,您传递的是一个char
,该字符随后被视为整数并取消引用,就好像它是导致未定义行为的指针一样
如果您阅读了文档,并且了解到char[]
被转换为char*
,并且取消对char*
poitner的引用将为您提供一个char
,那么您就会理解为什么这是错误的
启用编译器警告。如果您这样做,那么一个警告告诉您传递的类型是错误的,这将为您节省大量时间,并让您了解有关如何调用给定函数的更多信息
如果你忽视了警告,情况会更糟。除非事先知道编译器会抱怨某些事情,否则永远不要忽略警告。如果警告不是预期的,那么很可能是错误
printf(“%s”,*s)代码>->printf(“%s”,s)代码>*s
=s[0]
='r'
。您需要printf(“%s”,s)代码>或printf(“%c”、*s)代码>糟糕的问题标题,你应该想一个更好的标题。“如果我给客户看自行车的图片而不是刚买的汽车,为什么我会激怒他?”启用编译器警告。我现在犯了错误,你能解释一下在函数原型中使用char str[]和char*str有什么区别吗。对于函数调用,没有区别。原因是当您将其作为函数参数传递时,char[]
会自动转换为char*
。