这个双指针在c编程中有什么作用?

e5nszbig  于 2023-05-16  发布在  其他
关注(0)|答案(2)|浏览(149)
#include <stdio.h>

#define LENGTH 3

char *words[LENGTH];

int main( int argc, char *argv[] )
{
     char *pc;    // a pointer to a character
     char **ppc;  // a pointer to a pointer character

     printf( "\n------------Multiple indirection example\n" );

 // initialize our array string

   words[0] = "zero";
   words[1] = "one";
   words[2] = "two";

// print each element
   for ( int i = 0; i < LENGTH; ++i )
   {
      printf( "%s \n", words[i] );
   }

   ppc = words; // initialize the pointer to pointer to a character

   for( int i = 0; i < LENGTH; ++i)   // loop over each string
   {
       ppc = words + i;
       pc = *ppc;
           while (*pc != 0) {                   // process each character in a string
            printf("%c ", *pc);             // print out each character of the string individually
            pc += 1;
            }
        printf("\n");

   }



return 0;
}

写着“char**ppc“的部分声明了一个char双指针。ppc = word。一个被赋给单词的常规指针变量和这个双指针变量有什么区别?我也不明白为什么一个普通的指针变量会被赋值为一个双指针变量的值。有人能解释一下吗?

igetnqfo

igetnqfo1#

有两件事你需要学习:
1.所有数组自然 * 衰减 * 到指向其第一个元素的指针。例如,表达式word实际上与&word[0]相同。由于word是一个char *元素的数组,因此指向这样一个元素的指针必须是char **
1.对于任何指针(或数组)p和索引i,表达式p[i]*(p + i)完全相同。由此得出p[0]*(p + 0)相同,*(p + 0)*p相同。
如果我们现在把这些放在一起我们开始

ppc = words;

根据上述第1点,必须与

ppc = &words[0];

它使ppc指向数组words的第一个元素。
那我们有

ppc = words + i;

这将等于

ppc = &words[i];

也就是说,它使ppc指向数组words中的第i个元素。
终于有了

pc = *ppc;

也就是说

pc = ppc[0];

但由于ppc指向数组words的第i个元素,因此最后一次赋值实际上与

pc = words[i];

变量ppc在这个程序中并不是真正需要的,只是作为一个例子。
为了说明它,让我们“画”出来...
我们有words数组:

+---+     +--------+
| 0 | --> | "zero" |
+---+     +--------+
| 1 | --> | "one"  |
+---+     +--------+
| 2 | --> | "two"  |
+---+     +--------+

在循环的第一次迭代中,当i == 0时,则我们有

ppc = &words[0];

这导致了

+-----+     +---+     +--------+
| ppc | --> | 0 | --> | "zero" |
+-----+     +---+     +--------+
            | 1 | --> | "one"  |
            +---+     +--------+
            | 2 | --> | "two"  |
            +---+     +--------+

然后我们有第二次迭代,当i == 1,然后给予

ppc = &words[1];

看起来

+---+     +--------+
            | 0 | --> | "zero" |
+-----+     +---+     +--------+
| ppc | --> | 1 | --> | "one"  |
+-----+     +---+     +--------+
            | 2 | --> | "two"  |
            +---+     +--------+

对于循环的第三次也是最后一次迭代,也是完全相同的。

bgtovc5b

bgtovc5b2#

如果你想要一个char*(单词数组)的数组,你需要一个char** pointer
例如:char** wordsArr = {"hello","word"}char*的数组,您可以将每个单元格视为字符串。
它与char* words = "hello world"不同,因为如果我们只想打印第一个单词,printf("%s",words)将打印"hello world",而printf("%s",wordsArr[0])将打印"hello"

相关问题