惧留孙网

juliusun.com

在线教程 > C语言教程 > 数组参数

数组参数

第 32/50 节 冥河C语言教程


数组作为函数参数时,并不是把数组里的所有元素都传递给被调用函数,而仅仅是将数组首地址传递给函数。

由于是将数组首地址传递给函数,从本质是讲,数组作为参数,也是通过指针实现的。

数组作为参数时,被调用函数仅会获取到数组首地址,无法获取数组长度。

数组作为参数时,数组元素个数省略。如果不省略元素个数,编译器也会忽略元素个数。

注意:数组参数元素个数可以省略,如果数组元素又是数组,则数组元素的元素个数不能省略。如int a[ ]是合法的参数声明,而int a[ ][ ]是非法的参数,应该是int a[ ][常量]。

数组参数声明,可以将数组写成指针形式,如果是多维数组,注意运算符优先级,将星号和形参名加上括号。

数组作为参数的函数,常用的确定数组元素个数解决方法有两个:
    1、以特殊标志确定数组结束。如字符数组char []类型经常遇到'\0'字符,则将'\0'字符当作最后一个元素。
    2、再设置一个数字类型参数,由调用者传入这个参数,通知被调用者有效数组元素个数。

定义一个函数,输出一个3列不确定行数矩阵,例:


  1. #include<stdio.h>
  2. int main( )
  3. {
  4. void show(int a[ ][3],unsigned int length); //声明
  5. int a[5][3] = { {1,2,3}, {3,4,3}, {1,1,1}, {0,0,0}, {9,8,7}};
  6. show(a,5);
  7. getchar( ) ; //使程序暂停一下
  8. return 0;
  9. }
  10. void show(int a[ ][3],unsigned int length)//数组长度不能为负数,定义成无符号类型)
  11. //void show(int (*a)[3],unsigned int length) 这样定义同义
  12. {
  13. while(0 != length)
  14. {
  15. printf("%d\t%d\t%d\n",(*a)[0],(*a)[1],(*a)[2]);
  16. //同printf("%d\t%d\t%d\n",a[0][0],a[0][1],a[0][2]);
  17. ++a; //由于参数写法a[][3]同(*p)[3],所以a是指针,可进行自增自减运算
  18. --length;
  19. }
  20. }

代码难点解读

为什么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客服参与讨论。效果图类似如下:

Pic

效果图仅供参考。

作者:冥河 QQ:3304576112
交流QQ群:554701039 C语言讲课群
本教程内容由本站保留版权,请勿复制传播
抖音
©2015-2024 惧留孙网 juliusun.com

京ICP备15039193号-1

首页 教程 下载 文章 聊天 我的