在下面的代码中,为什么我不能取消引用数组名,因为当一个数组作为参数传递给一个函数时,它就变成了指向数组第一个元素的指针,那么为什么不能#t; t我们取消引用呢?
#include <stdio.h>
int main(void) {
char s[] = "radha";
int a[2] = {0,1};
printf("%s ", *s);
printf("%d", *a);
return 0;
}
我正在为上面的代码得到分段错误,这里的原因是什么,当我使用[0]时,它在内部被转换为*(a + 0),那么简单地做的问题是什么? * a或* S,请澄清。
答案 0 :(得分:7)
printf("%s ",*s);
期望第二个参数在传递char 'r'
时成为指向字符串的指针(解除引用s
会按预期为您提供第一个数组项。)
答案 1 :(得分:3)
我有两个建议,
阅读文档。
"%s"
说明符需要一个char
的指针,你传递一个char
,然后将其视为一个整数和解除引用,就好像它是一个导致UNDEFINED行为的指针。如果您阅读了文档,并了解char[]
已转换为char *
,那么取消引用char *
poitner会给您char
,那么您就会明白为什么这是错误的。
启用编译器警告。如果您这样做,那么告诉您传递错误类型的警告将为您节省大量时间并让您了解有关如何调用给定函数的更多信息。
如果您忽略了警告,情况会更糟。除非事先知道编译器会抱怨某事,否则不应忽略警告。如果没有预料到警告,则很可能是错误。