C语言中char **与char (*)[100]的区别及传参问题解析
char** 和 char (*)[100] 的区别及适用场景
类型本质差异
char (*)[100] 是什么?
声明char str[100]后,&str的类型是char (*)[100]——这是一个指向长度为100的char数组的指针。它指向整个数组的起始地址,指针每递增1,会跳过整整100个char的内存空间(即整个数组的大小)。char 是什么?**
声明char *p = str时,str会隐式转换成指向数组首元素的char*指针,&p的类型是char**——这是一个指向char指针的指针。它指向p这个变量本身的地址,指针每递增1,只会跳过一个指针大小的内存空间(通常是4或8字节,取决于系统)。
为什么传&str会报错?
你的函数 func 要求参数是 char**,但 &str 是 char (*)[100],两者类型完全不兼容:
char**期望指向「char指针变量」,而char (*)[100]指向的是「整个char数组」。- 两者的内存操作逻辑完全不同,编译器抛出类型不匹配错误,是为了避免后续操作出现逻辑bug(比如误将指针跳转了100个字节)。
各自的适用场景
1. char (*)[N](指向固定长度数组的指针)
- 适合需要操作整个数组,或需要保留数组长度信息的场景。
- 比如:函数需要处理固定大小的缓冲区,确保操作的是整个数组而非单个元素;或者传递数组时不想丢失其长度(数组退化成普通char*后无法直接获取长度)。
- 示例代码:
void print_array(char (*arr)[10]) { // 直接通过sizeof(*arr)获取数组长度10 for (int i = 0; i < sizeof(*arr)/sizeof(char); i++) { printf("%c ", (*arr)[i]); } } int main() { char arr[10] = {'a','b','c'}; print_array(&arr); return 0; }
2. char**(指向char指针的指针)
- 适合需要修改指针本身指向的场景,比如在函数内部递增指针、让指针指向新的动态分配内存,或者处理字符串数组。
- 比如你的需求:在函数里解析字符串并递增指针,就需要用char**——因为要修改传入的指针变量(比如
p)的指向,必须通过二级指针间接操作。 - 示例代码:
void advance_ptr(char **str) { // 递增指针,指向数组的下一个元素 (*str)++; } int main() { char str[100] = "hello"; char *p = str; printf("before: %c\n", *p); // 输出 'h' advance_ptr(&p); printf("after: %c\n", *p); // 输出 'e' return 0; }
另外,处理字符串数组时也常用到char**:
void print_strings(char **strs, int count) { for (int i = 0; i < count; i++) { printf("%s\n", strs[i]); } } int main() { char* arr[] = {"apple", "banana", "cherry"}; print_strings(arr, 3); // arr退化成char**类型 return 0; }
内容的提问来源于stack exchange,提问作者MatanCode
相关产品推荐
相关产品推荐

