Here, i attached code image如何处理字符数组?
如果图像不清晰,则参考此代码
#include <stdio.h>
int main() {
char c[3] = {'s', 'a', 'h'};
int a[3] = {1, 2, 3};
printf("%c\n", c);
printf("%d\n", a);
return 0;
}
我尝试了这个代码,但没有得到预期的结果。可能是我错误的期望,但想知道为什么会发生。
Here, i attached code image如何处理字符数组?
如果图像不清晰,则参考此代码
#include <stdio.h>
int main() {
char c[3] = {'s', 'a', 'h'};
int a[3] = {1, 2, 3};
printf("%c\n", c);
printf("%d\n", a);
return 0;
}
我尝试了这个代码,但没有得到预期的结果。可能是我错误的期望,但想知道为什么会发生。
2条答案
按热度按时间tzxcd3kk1#
在此代码片段中
在
printf
调用中使用的数组指示符c
和a
被隐式转换为指向其第一个char *
和int *
类型元素的指针。来自C标准(6.3.2.1 L值、数组和函数指示符)
3除非它是sizeof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,**类型为"类型数组"的表达式将转换为类型为"类型指针"的表达式,该表达式指向数组对象的初始元素,并且不是左值。**如果数组对象具有寄存器存储类,则该行为未定义。
但是转换说明符
c
和d
相应地期望char
和int
类型的对象。你得写下来
这和
如果你想输出数组的第一个元素的地址(即整个数组的地址的相同值),你需要使用转换说明符
p
。如果你想把地址输出为整数,你需要包含头文件
<inttypes.h>
和<stdint.h>
(最后一个已经包含在第一个头文件中),将指针转换为intptr_t或uintptr_t
类型,并使用适当的宏。程序输出可能如下所示
a0x5cqrl2#
你不能得到预期结果的主要原因如下。
这里c是地址类型而不是字符串,如果你想打印char数组的第一个值,你应该使用 *c,因为c是数组的第一个条目的地址,而不是值。
但是如果你想打印地址,打印类型应该是%d或者其他的,而不是%c。这就是printf(“%d\n”,a)工作的原因。
所以如果你想打印值,
如果你想打印地址,printf(“%d\n”,a);printf(“%d\n”,c);