You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中char**双指针的作用及与普通指针的区别解析

C语言指针与数组的疑问解答

示例代码

#include <stdio.h>

#define LENGTH 3

char *words[LENGTH];

int main( int argc, char *argv[] )
{
     char *pc;    // 指向字符的指针
     char **ppc;  // 指向字符指针的指针

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

     // 初始化字符串数组
     words[0] = "zero";
     words[1] = "one";
     words[2] = "two";

     // 打印每个字符串
     for ( int i = 0; i < LENGTH; ++i )
     {
        printf( "%s \n", words[i] );
     }

     ppc = words; // 初始化指向字符指针的指针

     for( int i = 0; i < LENGTH; ++i)   // 遍历每个字符串
     {
         ppc = words + i;
         pc = *ppc;
             while (*pc != 0) {                   // 遍历字符串中的每个字符
              printf("%c ", *pc);             // 逐个打印字符串的字符
              pc += 1;
              }
          printf("\n");
     }

return 0;
}

问题解答

1. 普通指针与双指针赋值给words的区别

首先明确words的本质:char *words[LENGTH]是存储char*类型元素的数组。在表达式中,数组名words会自动隐式转换为指向数组首元素的指针,也就是char**类型(因为数组元素是char*,指向它的指针自然是二级指针)。

  • 若尝试把普通指针(比如char* pc)赋值给words(即pc = words),首先数组名words不能作为左值被赋值(数组是不可修改的左值,仅能在初始化时赋值),其次类型完全不匹配:words转换后是char**,而pc是char*,编译器会直接抛出类型不兼容的错误。
  • 而双指针char** ppc赋值给words(即ppc = words)是完全合法的:两者类型均为char**,赋值后ppc指向数组words的第一个元素(也就是第一个字符串的首地址指针),后续可通过ppc遍历数组中的各个char*元素。

2. 为什么普通指针pc要赋值为*ppc

ppc是char**类型,对它解引用*ppc,得到的是它指向的内容——也就是数组words中的某个char*元素(比如words[0]、words[1],本质是对应字符串的首地址)。

pc是char*类型,正好和*ppc的类型匹配。把*ppc赋值给pc后,pc就指向了对应字符串的第一个字符,这样就能通过pc逐个遍历字符串里的每个字符,实现代码中逐个打印字符的逻辑。

内容的提问来源于stack exchange,提问作者ciphermute

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:59:54