我已经对此进行了一些谷歌搜索。问题是我只是找到了char指针或char指针指针的解释,以及char指针的数组。 其实我的程序正在运行。当我闭上眼睛接受一切时,世界就好了,但我不断地在脑海中浮现一些问题,我无法回答。长话短说我希望没有人会因为我的问题而杀了我,因为对你们中的一些人来说这似乎是微不足道的,显然这对我来说不是! 所以,我们走了:
char *pc;
char **ppc;
char *string[2] = {"Hello","World",};
ppc = string;
pc = *ppc;
printf("%p\n",ppc);
printf("%p\n",&pc);
printf("%p\n",*ppc);
printf("%p\n",pc);
printf("%p\n",&string[0]); //or &string
printf("%c\n", **ppc);
printf("%s", *ppc);
运行之后,我希望* ppc是第一个字符串的地址(第一个字符串的第一个字符),这不是,我也期待& pc和ppc之间的关系,但事实并非如此。 ppc是一个指向指针的指针,但是我对于ppc在到达字符串的第一个元素之前指向的指针一点也没有任何线索? 如果这听起来很愚蠢,我很抱歉,但我真的很想了解它。 任何帮助将不胜感激!
答案 0 :(得分:2)
您的代码调用未定义的行为,因为%p
会激活指向void的指针,因此所有您的print语句必须将其参数强制转换为void*
,例如printf("%p\n", (void*) ppc);
1}}。
解决此问题,现在绘制指针,例如:
我期待
*ppc
成为第一个字符串的地址(第一个字符串的第一个字符),这不是
是的!
检查printf("%p\n", (void*) ppc);
和printf("%p\n", (void*) &string[0]);
- 它们会产生相同的输出。
我也期待
之间的关系&pc
和ppc
ppc
具有第一个字符串的地址(“Hello”)。*ppc
具有字符串第一个字符的地址('H')。pc
具有字符串第一个字符的地址('H')。&pc
的地址为pc
。因此,您的期望是错误的,pc
和*ppc
应该具有相同的地址,而不是&pc
。
进一步解释:
string
是一个char
指针数组。 char **ppc;
是指向char
的双指针。
下面:
ppc = string;
您将ppc
设置为指向string
的第一个元素的地址。
此:
pc = *ppc;
使pc
指向ppc
实际指向的位置,即string
的第一个元素,即string[0]
。
答案 1 :(得分:1)
答案 2 :(得分:0)
变量string
是一个指向字符的指针数组,显然它必须去某处,即实际的数组。
当你这样做时
ppc = string;
您将string
的第一个元素的地址复制到ppc
,然后
pc = *ppc;
复制该内容,即string[0]
的值。
答案 3 :(得分:0)
在ppc = string;
之后,ppc
指向数组string
的第一个字符串,即它指向字符串"Hello"
(请注意,数组string
会衰减在这种情况下指向它的第一个元素)。
*ppc
是一个指向数组"Hello"
的第一个字符的指针
pc = *ppc;
使pc
指向相同字符串的相同字符" Hello"`。
这使得:
ppc
将包含第一个字符串的地址
*ppc
将包含第一个字符串的第一个字符的地址。
答案 4 :(得分:0)
内部| |
是值,内部* *
是地址。
| H | E | L | L | O |
*100*
| W | O | R | L | D |
*200*
| 100 | 200 | //string
*300*
现在ppc = string
,所以
ppc=>
| 300 |
*400*
现在为pc = *ppc
,pc = *300
为100
pc=>
| 100 |
*500*
现在,如果您执行printf("%s", pc);
,您将获得100的字符串存储,即HELLO
。