示例代码:
char map [20][20];
map [0] [0]=1;
printf ("%s\n", map[0][0]);
在编译过程中,我收到此警告:
warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’
虽然如果我写printf ("%s\n", &map[0][0]);
它会以某种方式正常运作。
为什么会这样?
编辑:
对不起我的坏杰夫。如果我试试这个
map [0][0]='X';
printf ("%s\n", map[0][0]);
我仍然得到同样的警告。
答案 0 :(得分:1)
在您发布的代码中,您尝试格式化字符串%s
,因此printf方法需要传递char *。如果你传递一个int或一个char它就会发出警告。
根据您需要的示例打印单个字符:
printf("%c\n", map[0][0]);
传递&map[0][0]
时它起作用的原因是因为你现在传入指向一个字符(char*
)的指针,这与传递一个字符数组相同。
请参阅printf reference。
答案 1 :(得分:0)
char本身是一个数值,一个8位整数,这样的代码可以获得警告。至于你的第二个问题,使用“address of”运算符获取map [0] [0]的地址会得到一个指向map [0]的第一个元素的指针,或者在这种情况下的值为1,而printf需要一个指向char数组的指针。 考虑一下:
char map [20];
map [0]=1;
printf ("%s\n", map); //or printf ("%s\n", &map[0])
都指向第一个元素,有效打印直到null,在数组中达到'\ 0'。
编辑:关于你的编辑,你仍然在访问第一个元素,它本质上是char,numeric。 'X'为您提供该角色的等效数字。
答案 2 :(得分:0)
它的工作原理是因为你发送了第一个元素(char *)类型的地址..参数在printf函数中得到了DECAYED,它希望一个char指针指向你案例中的字符数组