char *a = "apple";
printf("%s\n", a); // fine
printf("%s\n", a[1]); // compiler complains an int is being passed
为什么索引字符串指针会给我一个int?我期待它只是从第一个位置打印字符串(实际上当我使用&a[1]
时会发生这种情况)。为什么我需要获得地址?
答案 0 :(得分:13)
这就是定义[]
运算符的方式 - a[1]
,当a
是char *
时,在指向的char
之后获取下一个a
a[0]
(char
是第一个)。
这个难题的第二部分是int
值在作为函数的可变长度参数列表的一部分传递时始终被提升为unsigned int
(或很少,a
)。 / p>
&a[0]
相当于&a[1]
,它从第一个字符开始打印 - 因此a + 1
从第二个字符开始打印是有意义的。您也可以使用%c
- 这完全等效。
如果使用打印单个字符的a[1]
转换说明符,则可以使用printf("%c\n", a[1]);
仅打印第二个字符:
{{1}}
答案 1 :(得分:6)
表达式a[1]
产生一个 char ,并在表达式中扩展为 int 。
您可以使用%c
打印字符:
char *a = "apple";
printf("%c\n", a[1]); // prints 'p'
您可以使用a+1
来实现您想要的效果,例如
printf("%s\n", a+1); // prints 'pple'
另一种解释方法:
char *a2 = a+1; // a2 points to 'pple'
a[1] ≡ *(a+1) ≡ *a2
答案 2 :(得分:2)
%s需要char *指针。单独的Char被解释为整数。 而且,[1]给你第二个元素,而不是第一个元素!
答案 3 :(得分:2)
字符(即[1]求值的东西)是整数,但printf()的“%s”格式化程序需要一个指针。请注意,检测到此错误的事实是某些编译器提供的扩展功能 - 它不是标准C的一部分。其他编译器只会在运行时失败,可能是核心转储。
答案 4 :(得分:0)
char *a = "bla"
a
:是char*
,您应该%s
使用printf(...)
;
a[1]
相当于*(a+1)
,然后a[1]
是char
,您应该%c
使用printf(...)
;
&a[1]
相当于&(*(a+1))
,然后&a[1]
是char*
,您应该%s
使用printf(...)
;
这更像是一个指针问题。为了更好地理解指针是如何工作的,请这样思考:
char *j;
j
是char*
*j
是char
,与j[0]
相当
*(j+1)
是char
,与j[1]
相当
&(*j)
是char*
,相当于&j[0]
,相当于j
&j
是char**
另一个例子:
char j**
j
是char**
*j
是char*
**j
为char
,与*(*(j+0)+0)
等效,与j[0][0]
等效
&j
是char***
依旧......