本专栏作为《C语言程序设计》的阅读笔记分享,希望同大家一起进步!
5.6 指针数组以及指向指针的指针
指针数组:数组中的每个元素都是指针。
char *a[5];
int func(char *b[]) {}
那么,如 a , a + 1 , a + 2 等就是所谓指向指针的指针。
5.7 多维数组
二维数组定义:
int a[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
二维数组的每一个元素是一维数组。
按行存储,第一行存完接着存第二行。
如果将二维数组作为参数传递给函数,那么函数的参数声明中必须指明数组的列数,行数无所谓。声明如下:
int func(int a[2][3]) {}
int func(int a[][3]) {} // 行可以不给
int func(int (*a)[3]) {}
// 声明一个指针a,指向有3个元素的一维数组。
// (*a)的括号是必要的。因为[]的优先级比*高,int *a[3]表示:声明一个数组a[3],其中每个元素是指针类型。
当传递一维数组的时候,并未传递元素个数(其实想想传了也没用),写函数内部程序的时候自己控制。
当传递二维函数的时候,外面那层(行数)也不传,写函数内部程序的时候自己控制。但是列数不可以省略!如果声明 a[ ][3] ,那么在行数控制范围内,我调用 a[1][2] 的时候,函数可以知道这个元素在 a + 1 * 3 + 2(指针表示,a 为数组起始地址,注意按行存储);该计算式与数组 a 定义了几行无关,但如果不知道列数 3 的话,这一步计算完成不了。同理,函数在声明多维数组参数时只有第一维大小可以省略,其他必须写。如,若三维数组定义为 a[3][4][5] ,那么 a[x][y][z] 的指针为 a + x * ( 4 * 5 ) + y * 5 + z (计算方法有点像进制),没有第一维大小 3 什么事。
5.8 指针数组的初始化
数组该怎么初始化就怎么初始化,只不过元素是指针类型。注意字符串也是以指针类型声明的。
书上示例:编写一个函数 month_name(n) ,返回 n 月名字。
#include<stdio.h>
char *month_name(int n) {
char *name[] = {
"Illegal month!",
"January", "Febuary", "March",
"April", "May", "June",
"Jluy", "August", "September",
"October", "November", "December"
};
return (n < 1 || n > 12) ? name[0] : name[n];
// 外面套一层函数为的就是这句
}
int main() {
printf("%s\n", month_name(13));
}
本人水平有限qwq,如果觉得哪里有问题请在评论区留言~