如果
char d[3];
d[0] ='p';
d[1] ='o';
d[2] ='\0';
怎么来
printf("%s\n",d[0]);
无法正常工作。
但如果我有
char n[2][4];
n[0][0]=’T’; n[0][1]=’o’; n[0][2]=’m’; n[0][3]=0;
n[1][0]=’S’; n[1][1]=’u’; n[1][2]=’e’; n[1][3]=0;
printf("%s %s\n", n[0],n[1]);
它会打印整个字符串吗?
答案 0 :(得分:2)
由于
d[0] - is a character
和
n - is and array of and array of characters. I.e. an array of strings
答案 1 :(得分:2)
d[0]
是数组中包含的第一个字符,而printf
需要第一个字符的地址。
这是您在源代码中使用d
时获得的地址,或者您可以使用&(d[0])
明确地处理该地址,该地址位于该地址的开头处。数组: - )。
您的二维数组工作的原因完全相同:n[0]
是n[0][0]
的地址,与d
的相同方式相同地址d[0]
。
如果您将n[0][0]
(角色)传递给printf
,则会遇到与通过d[0]
时相同的问题。
答案 2 :(得分:1)
printf("%s\n",d[0]);
技术上是undefined behavior
。 printf
的文档描述了各种转换说明符。
<强>取值强>
如果不存在l修饰符:期望const char *参数 是指向字符类型数组(指向字符串的指针)的指针。 数组中的字符被写入(但不包括)a 终止空字节(&#39; \ 0&#39;);
如果启用警告,即-Wall
,您可能会获得:
warning: format '%s' expects argument of type 'char *', but argument 2 has type
'int' [-Wformat=]
printf("%s\n",d[0]);
为什么第二个例子有效,请阅读array-to-pointer conversions。 James McNellis写道:
在C和C ++中,可以使用数组,就像它是指向它的指针一样 第一要素。实际上,给定一个名为x的数组,您可以替换 大多数
&x[0]
只使用x。[...]
void f(int* p); int x[5]; f(x); // this is the same as f(&x[0])
所以n[0]
相当于&n[0][0]
,正如d
相当于&d[0]
。但d
不等同于d[0]
。
答案 3 :(得分:0)
当你尝试打印yor string d
时,你将它传递给数组的第一个字符:
printf("%s\n",d[0]);
d[0]
表示&#34;存储在数组0
&#34;的索引d
中的内容。这是文字字符'p'
,而不是字符串的开头。printf
)将字符传递给%s
我们未定义的行为可能会导致问题。不要这样做使用printf
打印字符串时,需要传递指向字符串的指针,该字符串是指向字符串第一个元素的指针(而不是元素本身)。
&d[0];
^^ ^
|| Index 0
|array d
Address of
这将计算数组0
的{{1}}索引的地址
另外,我们可以利用数组降级到类型指针的事实。
d
这意味着我们可以取消&d[0] == &(*(d+0)) == d
和&
运算符,只需传递[]
:
d
这将打印字符串。
使用第二个示例,使用二维数组printf("%s\n", d);
可提供额外的间接级别(相当于[][]
)。
这意味着当您调用char **
时,当您传入printf
和n[0]
时,您实际上是将指针传递给每个字符串中的第一个字符。即n[1]
和&n[0][0]
。