任何人都可以解释它的打印输出如何“墨水”

时间:2010-03-17 10:45:35

标签: c pointers obfuscation

我是C的新手。我知道基本概念。在下面的代码中,为什么打印“墨水”作为其输出?

#include<stdio.h>


main()
{
    static char *s[]={"black","white","pink","violet"};

    char **ptr[]={s+3,s+2,s+1,s},***p;

    p=ptr;

    ++p;

    printf("%s",**p+1);
}

由于

4 个答案:

答案 0 :(得分:14)

让我们追踪它:

ptr = {pointer to "violet", pointer to "pink", pointer to "white", pointer to "black"}

p = ptr --> *p = pointer to "violet"

++p -->     *p = pointer to "pink"

这意味着:

*p = {'p','i','n','k','\0'}

这意味着:

**p = 'p'
**p + 1 = 'i'

所以**p + 1是指向此字符串的指针:{'i', 'n', 'k', '\0'},它只是"ink"

答案 1 :(得分:4)

s是一个char *数组(代表字符串)。

ptr是一个指向指针的数组(指向s的值,它们是指向字符串的指针)

p设置为指向ptr[0](指向s[3]或“紫罗兰”的指针)

p会增加指向ptr[1],指向s[2]或“粉红色”

在printf语句中,p被解除引用两次。第一个deref是指向s[2]的指针,第二个deref指向s[2] - “粉红色”的值。 +1将指针移动到“粉红色”的开头一个字符,因此从这里打印到字符串的末尾会给你“墨水”。

答案 2 :(得分:0)

我建议你从你所知道的印刷品(“粉红色”中的'墨水')向后工作,看看不同的变量必须指向哪里发生。

请记住,数组可以被视为指向其第一个元素的指针,并且字符串可以类似地被视为指向其第一个字符的指针。

答案 3 :(得分:0)

  

静态字符   * S [] = { “黑”, “白”, “粉红色”, “紫色”};

     In the above statement you are initialize. 

     char **ptr[]={s+3,s+2,s+1,s}

       In the above statement you are assign pointer s value to ptr
     

值。并声明一个三重指针。

    p=ptr; 
    In the above statement you assign the double pointer address to
     

三重指针。

   ++p; 

   In the above statement you increment the triple pointer value. So
     

那个时候它指向“粉红色”。

   But you are print the **p+1. That time it will print only "ink".
     

如果你打印**(p + 1),那个时候   将打印“白色”。因为在   初始化双指针你   初始化“s + 2”。那个时候呢   将指向“白色”。