Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 为什么在打印字符串时不使用反引用?_Arrays_C_String_Printf_Dereference - Fatal编程技术网

Arrays 为什么在打印字符串时不使用反引用?

Arrays 为什么在打印字符串时不使用反引用?,arrays,c,string,printf,dereference,Arrays,C,String,Printf,Dereference,如何在C中使用字符串名称打印字符串而不取消引用它 就像这里: char str[]; printf("%s",str); 但对于数组,我们使用方括号[]取消引用来打印数组: int a[10]; for(i=0;i<10;i++); printf("%d",a[i]); inta[10]; 对于(i=0;i,这完全取决于函数(printf或else)的期望值 将printf与%s一起使用时,如 printf("%s",s

如何在C中使用字符串名称打印字符串而不取消引用它

就像这里:

char str[];
printf("%s",str);
但对于数组,我们使用方括号[]取消引用来打印数组:

int a[10];
for(i=0;i<10;i++);
   printf("%d",a[i]);
inta[10];

对于(i=0;i,这完全取决于函数(printf或else)的期望值

将printf与%s一起使用时,如

printf("%s",str);
printf()需要“一个字符串”,在C语言中,它与“一个[NUL终止]字符的数组”相同。因此,您只需要传递一个真正标识整个数组的东西:它的名称(衰减到第一个元素的地址)

这同样适用于每个需要数组作为参数的函数

如果必须向调用的函数传递其他内容,则使用不同的方法

printf("%d",a[i]);
您必须传递一个整数;而数组不是一个整数,因此您必须使用正确的符号/机制从数组中取消引用(或“选择”)一个整数。但是,如果您想使用结构的成员,情况并没有什么不同。您不能传递printf()一个结构,因此您可以使用点来选择[correct]结构的成员。这同样适用于指向整数的指针,当您需要值而不是指针本身时,可以取消对它们的引用。对于函数,如

printf("%d", (int) floor(PI));

在上一行中,同样,如果printf想要一个整数,您必须给它一个整数,因此要使用PI(3.14),您必须将其转换为int。

,因为这是printf
接口的要求

  • 如果是
    “%s”
    ,则需要指向以NUL结尾的字符串的指针
  • 如果是
    “%d”
    ,它需要一个int

对于初学者,例如这样的代码片段

char str[5] = "Hello";
printf("%s",str);
可能导致未定义的行为

格式字符串
“%s”
要求参数是指向字符串第一个字符的指针

在C语言中,字符串被定义为以零字符
'\0'
结尾的字符序列。这是一个包含字符串的字符数组,其前哨值为
'\0'

所以实际上printf的这种调用

printf("%s",str);
逻辑上类似于下面的代码

while ( *str != '\0' ) putchar( *str++ );
在上面的例子中

 char str[5] = "Hello";
字符数组
str
不包含字符串,因为它的五个元素是由字符串文字
“Hello”
的字符初始化的,不包括其终止零字符(数组中没有足够的空间容纳字符串文字的第六个字符
'\0'

这么说

printf("%s",str);
对于上面声明的数组,将尝试输出内存中数组后面的任何内容

为了避免未定义的行为,您应该声明数组,例如

 char str[6] = "Hello";
或者

 char str[] = "Hello";
对于其他基本类型的数组,在大多数情况下,它们没有标准的sentinel值。与字符串相反,不可能为整型或浮点数组定义这样的sentinel值

因此,包含字符串的字符数组不包括在所有类型的数组中。根据C中字符串的定义,字符串始终以零字符结尾。
'\0'
。这对其他类型的数组无效


因此,要输出任何其他类型的数组,通常需要使用一个循环,知道需要输出多少个元素。

但对于数组,我们使用方括号[]的解引用来打印数组-不,您不需要。
printf(“%d”,a[i]”);
打印单个元素,而不是整个数组。这就是为什么要循环数组。这两个示例的前导错误,因为它们没有显示相同的szenario。+“%s”格式需要指向字符串的指针对于第一种情况,请尝试
printf(“%d”,str[0]);
,您将看到在
str
中获得第一个字符的ASCII值。这种情况显示的场景与第二种情况相同,而不是第一个示例。