c - 为什么将字符指针索引为int是有意义的?

时间:2010-04-18 10:13:37

标签: c string

char *a = "apple";
printf("%s\n", a);  // fine
printf("%s\n", a[1]);  // compiler complains an int is being passed

为什么索引字符串指针会给我一个int?我期待它只是从第一个位置打印字符串(实际上当我使用&a[1]时会发生这种情况)。为什么我需要获得地址?

5 个答案:

答案 0 :(得分:13)

这就是定义[]运算符的方式 - a[1],当achar *时,在指向的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;

jchar*
*jchar,与j[0]相当 *(j+1)char,与j[1]相当 &(*j)char*,相当于&j[0],相当于j
&jchar**

另一个例子:

char j**

jchar**
*jchar* **jchar,与*(*(j+0)+0)等效,与j[0][0]等效 &jchar***

依旧......

相关问题