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

C语言中char **与char (*)[100]的区别及传参问题解析

char** 和 char (*)[100] 的区别及适用场景

类型本质差异

  1. char (*)[100] 是什么?
    声明 char str[100] 后,&str 的类型是 char (*)[100]——这是一个指向长度为100的char数组的指针。它指向整个数组的起始地址,指针每递增1,会跳过整整100个char的内存空间(即整个数组的大小)。

  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:17:19