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
相关产品推荐
相关产品推荐

