我是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);
}
由于
答案 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”。那个时候呢 将指向“白色”。