多维数组和二级指针#

数组的元素类型可以是任意的,特别的是,数组的元素也可以是数组。这种数组的数组称为多维数组

声明并初始化多维数组可以这么写:

char stringArr[3][4] = {"cat", "dog", "rat"};
int matric[3][3] = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

printf("%s\n", stringArr[0]);  // "cat"
printf("%d\n", matric[0][1]);  //  2

注意,数组 stringArr 的第二维大小为 4,足够存放字符串的结尾字符。

思考:如果将 4 改成 3 会发生什么情况呢?

指针数组/二级指针#

由于字符串大小比较灵活,上述声明方式不便于组织不同大小的字符串。为了解决这个问题,我们可以声明一个指针数组,即数组的元素类型为指针,再通过指针指向字符串的位置。

char* stringArray[5]; // 存储 5 个 char* 指针

回顾 main 函数参数 char* argv[],当执行 ./swapwords apple banana 时,argv 内存布局类似下图所示:

由于数组参数会退化为指针,所以 char* argv[] 在函数内会变为 char** argv