#include<stdio.h>
#include<conio.h>
main()
{
char *q[]={"black","white","red"};
printf("%s",*q+3);
getch();
return 0;
}
代码提供输出“ck
”。在此我想知道如何评估*q+3
表达式。
首先评估*q
表示3
,然后将*q
添加到*q
指向的位置。在整数数组的情况下,它很容易实现,但这里3
指向“黑色”,然后{{1}}添加到什么内容?
答案 0 :(得分:3)
q被解除引用,指向q [0]。这是一个指向字符串文字“黑色”的指针。然后添加三个,使其指向“黑色”中的“c”。当作为字符串传递时,printf()将其解释为“ck”。
你不明白还有什么?
答案 1 :(得分:2)
char * []是char *的数组。也就是说,q中的每个元素都是char *。所以,当你做* q时,你得到一个指向“黑色”的指针,就好像你已经这样做了:
char const * str = "black";
因此,如果你添加3你在字符串内移动,直到字符“c”,因此它打印“ck”。
答案 2 :(得分:1)
* q指向包含'b'的内存地址。例如,假设此地址在内存中为100。添加3给出103存储'c'的位置。
在C中使用“...”定义字符串时,它会在所有字符的末尾自动显示“\ 0”或0,而C使用此空字符来检测字符串的结尾。在您的情况下,地址105包含'\ 0'。
也就是说,它只打印103和104中的字符:“ck”。
答案 3 :(得分:1)
*
- dereferencer知道(由编译器)它有多大,如果你添加一个值,你会根据值的类型跳转到下一个位置。
so int * p; * p + 3向前移动三个整数(sizeof(int))。 (* p)+3给出p下的值并加3。
答案 4 :(得分:0)
当您对C / C ++有疑问时,一个非常好的资源是http://www.cplusplus.com/。
关于指针的文章在这里:http://www.cplusplus.com/doc/tutorial/pointers/。