这是令我困惑的代码。
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"?
答案 0 :(得分:1)
在++p
之后,p
未指向"粉红色"。它指向ptr[1]
,ptr[1]
指向s[2]
,s[2]
指向"粉红色"的第一个字符。
*p
为ptr[1]
,**p
为s[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
指向p
,ptr[1]
评估为*p
。现在ptr[1]
指向ptr[1]
,因此s[2]
评估为**p
。 s[2]
指向字符串文字s[2]
的第一个元素。这意味着"pink"
指向下一个元素,即第二个元素**p + 1
。
'i'