Arrays 为什么在打印字符串时不使用反引用?
如何在C中使用字符串名称打印字符串而不取消引用它 就像这里: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
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
接口的要求
- 如果是
,则需要指向以NUL结尾的字符串的指针“%s”
- 如果是
,它需要一个int“%d”
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值。这种情况显示的场景与第二种情况相同,而不是第一个示例。