前言
此系列记录个人重温与回顾C语言学习中的心得
参考书目: C Primer Plus 第6版
心得
- 指向多维数组的指针: int (*pz)[2].该指针对应的数组类型是int zippo[4][2];可以理解为pz存的是zippo第一维度元素的地址,而第一维度元素下的内存空间占有两个int类型的空间.
- 声明一个指向N维数组的指针时,只能省略最左边方括号中的值,如:
int ar[][2][3][4]
int (* ar)[2][3][4]
- 多维数组与函数结合时,需要注意编译器会自动将数组表示法转换为指针表示法.结合上面关于指针与多维数组的关系可以理解:函数声明中对于指向多维数组的指针的表示法为:
int sum2(int ar[][4], int rows);
- 变长数组(VLA).对于第三点中的函数声明只适用于array[][4]这样的数组.当需要处理array1[][5],array2[][6].这样的数组时则需要重写函数.为此引入VLA.
用变量来定义数组每个维度的大小时,该变量只能是auto存储类别,不能是static与extern.且不能在声明中(包括在函数中声明与作为形参声明时)进行初始化.
函数中用VLA作为形参时需要注意形参声明顺序
正确形式
int sum2d(int rows,int cols,int ar[rows][cols]);
//C99与C11允许忽略形参原型中的形参名,此时必须用*号来代替省略的维度
int sum2d(int ,int, int ar[*][*]);
错误形式
int sum2d(int ar[rows][cols], int rows,int cols);
- 复合字面量. 是一种常量.且匿名.必须在创建的同时使用它.
\\ 给定大小的初始化
(int [2]){10,20};
\\ 省略大小的初始化
(int []){50,60,90};
\\ 用法1 使用指针记录复合字面量的地址
int * pr;
pr = (int [2]){10,20};
\\ 用法2 函数形参 经典用法 调用函数时,第一个实参为复合字面量,第二个为复合字面量的大小.
int sum(const int ar[],int n);
int total3;
total3 = sum((int []){4,5,6},3);
(更新于21/9/1)