juliusun.com
第 32/50 节 冥河C语言教程
数组作为函数参数时,并不是把数组里的所有元素都传递给被调用函数,而仅仅是将数组首地址传递给函数。
由于是将数组首地址传递给函数,从本质是讲,数组作为参数,也是通过指针实现的。
数组作为参数时,被调用函数仅会获取到数组首地址,无法获取数组长度。
数组作为参数时,数组元素个数省略。如果不省略元素个数,编译器也会忽略元素个数。
注意:数组参数元素个数可以省略,如果数组元素又是数组,则数组元素的元素个数不能省略。如int a[ ]是合法的参数声明,而int a[ ][ ]是非法的参数,应该是int a[ ][常量]。
数组参数声明,可以将数组写成指针形式,如果是多维数组,注意运算符优先级,将星号和形参名加上括号。
数组作为参数的函数,常用的确定数组元素个数解决方法有两个:
1、以特殊标志确定数组结束。如字符数组char []类型经常遇到'\0'字符,则将'\0'字符当作最后一个元素。
2、再设置一个数字类型参数,由调用者传入这个参数,通知被调用者有效数组元素个数。
定义一个函数,输出一个3列不确定行数矩阵,例:
代码难点解读
为什么show函数定义时用用指针方式int (*a)[3]中要把*a括起来?
根据 C语言运算符优先级表方括号[]优先级高于星号*,所以不加括号int *a[3]意义是int *(a[3]),代表的意思是,a是个数组,每个元素都是int *类型这显示是错误的,所以要用小括号()括起*a代表是指针类型,然后再确定指向内容是3个元素的int类型数组
为什么第20行把*a括起来?
根据 C语言运算符优先级表方括号[]优先级高于星号*,所以不加括号*a[2]意义是int *(a[2]),代表的意思是,a数组中下标为2的元素指向的内容。我们要的是a指向的内容,而不是a下标为2的内容。
如果show函数中的参数a可以自增自减,是不是main函数中的变量a也可以自增自减?
不可以!因为参数中的数组编译器是当指针处理的,指针变量可以自增自减。而main中的a是数组名,代表数组首地址,数组一定义,内存地址确定,无法改变,好比变量定义后地址也是确定的一样,不能改变。如果变量地址随便变,编译器会找不到变量的。
第20行的代码和第21行的注意,为什么*a可以写成a[0]?
请参考 指针与数组
上例有些复杂,同时给出了数组参数,哪个元素个数不能省略,哪个可以省略。不明白可以加QQ群或作者QQ、QQ客服参与讨论。效果图类似如下:
效果图仅供参考。