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

Ton*_*ark 4 c string

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

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

caf*_*caf 13

这就是[]操作符的定义方式 - a[1]aa是a时char *,char在指向的那个之后获取下一个a(a[0]是第一个).

这个难题的第二部分是,当作为函数的可变长度参数列表的一部分传递时,char值总是被提升为int(或很少unsigned int).

a相当于&a[0],它从第一个字符打印 - 所以&a[1]从第二个字符开始打印是有意义的.你也可以使用a + 1- 这完全等同.

如果使用%c打印单个字符的转换说明符,则可以使用a[1]仅打印第二个字符:

printf("%c\n", a[1]);
Run Code Online (Sandbox Code Playgroud)


Hen*_*man 6

该表达式a[1]产生一个char,并在表达式中扩展为int.
你可以打印一个字符%c:

char *a = "apple";
printf("%c\n", a[1]);   // prints 'p'
Run Code Online (Sandbox Code Playgroud)

你可以通过使用实现你想要的东西a+1,比如

printf("%s\n", a+1);    // prints 'pple'
Run Code Online (Sandbox Code Playgroud)

另一种解释方法:

char *a2 = a+1;   // a2 points to 'pple'   
a[1] ? *(a+1)  ? *a2 
Run Code Online (Sandbox Code Playgroud)