c编程语言,指针

时间:2010-10-10 08:03:41

标签: c pointers

#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}}添加到什么内容?

5 个答案:

答案 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/