C问题与理解指针数组

时间:2017-09-15 12:37:37

标签: c arrays string pointers memory

我已经对此进行了一些谷歌搜索。问题是我只是找到了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在到达字符串的第一个元素之前指向的指针一点也没有任何线索? 如果这听起来很愚蠢,我很抱歉,但我真的很想了解它。 任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:2)

您的代码调用未定义的行为,因为%p会激活指向void的指针,因此所有您的print语句必须将其参数强制转换为void*,例如printf("%p\n", (void*) ppc); 1}}。

解决此问题,现在绘制指针,例如:

enter image description here

  

我期待*ppc成为第一个字符串的地址(第一个字符串的第一个字符),这不是

是的!

检查printf("%p\n", (void*) ppc);printf("%p\n", (void*) &string[0]); - 它们会产生相同的输出。

  

我也期待&pcppc

之间的关系
  • 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)

图片等char为黄色,char*橙色,char**蓝色 enter image description here

这封信' e'可以pc[1]string[0][1] *ppc[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 = *ppcpc = *300100

 pc=>
      | 100 |
       *500*

现在,如果您执行printf("%s", pc);,您将获得100的字符串存储,即HELLO