用二级指针实现字符串数组
先记核心原理:
- 字符串本质:
char* - 字符串数组本质:一堆 char放一起*
- 二级指针
char**就是用来指向 char* 数组
一、原理一句话
char** str是二级指针,它指向一个一维指针数组,数组里每个元素都是char*(字符串首地址)。
方式 1:直接用二级指针指向静态字符串数组
c
运行
#include <stdio.h> int main() { // 字符串常量数组:每个元素是 char* char *arr[] = { "Java", "C语言", "Python", "C++" }; // 二级指针 指向 指针数组首地址 char **str = arr; // 遍历打印 for (int i = 0; i < 4; i++) { // str[i] 等价 *(str+i),拿到每个字符串 printf("%s\n", str[i]); } return 0; }解析
char *arr[]:指针数组,存 4 个字符串地址char **str = arr:二级指针接收指针数组名- 数组名本身就是首元素地址,首元素是
char*,所以要用char**接收
方式 2:动态内存版(二级指针手动申请字符串数组)
适合不确定个数、动态增删场景
c
运行
#include <stdio.h> #include <stdlib.h> int main() { int n = 3; // 1. 申请n个 char* 指针的数组 char **str = (char**)malloc(n * sizeof(char*)); // 2. 给每个字符串单独申请空间 str[0] = (char*)malloc(10 * sizeof(char)); str[1] = (char*)malloc(10 * sizeof(char)); str[2] = (char*)malloc(10 * sizeof(char)); // 3. 赋值 str[0] = "北京"; str[1] = "上海"; str[2] = "广州"; // 遍历 for (int i = 0; i < n; i++) { printf("%s\n", str[i]); } // 释放内存 for (int i = 0; i < n; i++) { free(str[i]); } free(str); return 0; }方式 3:函数参数用二级指针传字符串数组
最常用场景:子函数接收字符串数组
c
运行
#include <stdio.h> // 用二级指针接收字符串数组 void printStr(char **str, int n) { for (int i = 0; i < n; i++) { printf("%s\n", str[i]); } } int main() { char *arr[] = {"苹果", "香蕉", "橙子"}; // 传数组名,退化为二级指针 printStr(arr, 3); return 0; }关键总结
- 字符串数组:
char* 数组 - 接收它必须用:char** 二级指针
- 访问写法完全一样:
str[i]就能当字符串用 - 静态用指针数组赋值,动态用
malloc给二级指针开辟指针数组空间
