C程序:字符串的指针和指针

时间:2014-04-08 05:42:09

标签: c pointers

这是令我困惑的代码。

static char *s[] = {"black", "white", "pink", "violet"};
char **ptr[] = {s+3, s+2, s+1, s}, ***p;
p = ptr; // p point to the address of (s+3), so "violet"
++p;     // p point to "pink"
printf("%s", **p+1); // I though it print "pink" but answer is "ink", I'm not sure about the sequence of ** and +, which executes first and how is this one begins from "i"?

4 个答案:

答案 0 :(得分:1)

++p之后,p未指向"粉红色"。它指向ptr[1]ptr[1]指向s[2]s[2]指向"粉红色"的第一个字符。

*pptr[1]**ps[2]。所以**p + 1&s[2][1],即" i" in" pink"。

就像:

char *ptr = **p;   // ptr points to the 'p' in "pink"
printf("%s", ptr + 1);

答案 1 :(得分:0)

**p指向pink(即**p == s[2])。递增指针(**p) + 1将使其指向i中的pink,因此printf将打印ink。初级。 :)

经验法则是,如果您觉得需要声明三重指针,那么您做错了。

答案 2 :(得分:0)

*p提供ptr[1] **p提供存储在s+2 i,e "pink"的值,并指向字符p 现在**p+1提供字符串ink

答案 3 :(得分:0)

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

上面的语句将s定义为一个字符数组,并使用指向大括号中包含的字符串文字的第一个元素的指针初始化其元素。 static表示数组s具有内部链接,其生命周期延伸到整个程序运行。

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

上述语句将ptr定义为类型为char **的对象数组,即指向字符指针的指针。它还定义了类型p的{​​{1}},即指向指向字符的指针的指针。它使用指向数组char ***的元素的指针初始化ptr

因此,s指向ptr[0]s[3]指向ptr[1],依此类推。以下两个陈述是等效的。这是因为数组s[2]衰减(计算)指向其第一个元素的指针。

ptr

执行上述语句的副作用是增加p = ptr; // the above is equivalent to p = &ptr[0]; ++p; // makes p point to the next element of ptr ,即使其指向下一个p元素。

ptr[1]

间接运算符**p+1 具有更高的优先级。因此,首先评估*。由于**p指向pptr[1]评估为*p。现在ptr[1]指向ptr[1],因此s[2]评估为**ps[2]指向字符串文字s[2]的第一个元素。这意味着"pink"指向下一个元素,即第二个元素**p + 1

'i'