C语言将数组作为函数参数
发布时间:2020-12-15 17:32:38 所属栏目:百科 来源:网络整理
导读:一个函数的形参是普通的局部变量。当发生函数调用时,程序创建这些形参,然后用对应的实参来初始化这些形参。形参的作用域就是函数块。 函数内可以改变形参的值,而不会影响调用上下文中实参的值。 如果需要将一个数组当作实参传入函数,则应把对应的形参声
一个函数的形参是普通的局部变量。当发生函数调用时,程序创建这些形参,然后用对应的实参来初始化这些形参。形参的作用域就是函数块。函数内可以改变形参的值,而不会影响调用上下文中实参的值。 如果需要将一个数组当作实参传入函数,则应把对应的形参声明成下面的形式: 类型 名称[ ] 因为,当把数组名作为函数实参时,它会自动被转换为指针。所以上面的声明等同于下面的声明: 类型 *名称 当使用数组来声明函数参数时,方括号 [] 内的任何常量表达式都会被忽略。在函数块内,数组参数名是一个指针变量,并且数组的值可以在该函数内被修改。例 1 中的函数 addArray()将两个数组中对应索引元素的值相加。 【例1】函数 addArray() // addArray() 将第二个数组中每个元素的值加到第一个数组对应元素上 //(例如,“array1 += array2”) // 参数:两个float类型的数组,以及它们共同的长度 // 返回值:无 void addArray( register float a1[ ],register const float a2[ ],int len ) { register float *end = a1 + len; for ( ; a1 < end; ++a1,++a2 ) *a1 += *a2; } 对于函数中的数组参数使用另一种表示法,上述函数 addArray()可等效为以下形式: void addArray( register float *a1,register const float *a2,int len ) { /* 函数块内容与前述一样 */ } 使用方括号 [] 声明函数数组参数的一个优点就是可读性好,它可以显著地标识出函数将该参数作为指向数组的指针,而不是一个独立的 float 变量。在参数声明时,数组风格的表示法还有两个特点: (1) 在参数声明时(也只有在该情况下),C99 允许将类型限定符 const、volatile 和 restrict 放在方括号内。这个功能允许声明具有限定符指针类型的参数。 (2) 而且,在 C99 中,也可以将存储类修饰符 static 连带整数常量表达式一起放在方括号内。这种方法表示,在函数调用的时数组内元素数量至少等于该常量表达式。 下面一个示例展示了上述这些特点: int func( long array[const static 5] ) { /* ... */ } 在这里所定义的函数中,参数 array 是一个指向 long 类型的常量指针,所以不能被修改。它指向一个至少有 5 个元素的数组。 C99 同时允许将数组参数声明成可变长度的数组。方法是将一个非常量的、且为正数的整数表达式放在方括号之间。在这种情况下,数组参数仍然是指向第一个数组元素的指针。不同之处在于,数组元素本身也允许长度可变。 在例 2 中,函数 maximum()的第 3 个参数是一个二维数组,其长度可变。 【例2】函数 maximum() // 函数 maximum() 获得double类型二维数组中的最大值 // 参数:行数、列数、二维数组 // 返回值:最大元素的值 double maximum( int nrows,int ncols,double matrix[nrows][ncols] ) { double max = matrix[0][0]; for ( int r = 0; r < nrows; ++r ) for ( int c = 0; c < ncols; ++c ) if ( max < matrix[r][c] ) max = matrix[r][c]; return max; } 参数 matrix 是一个指针,它指向一个具有 ncols 个元素的数组。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ruby-on-rails – “识别”命令无法识别图像文件. (Heroku的
- ajax基本通用代码示例
- ruby-on-rails – 使用fonttastic提交按钮的字体真棒
- Dojo 的Ajax, dojo/request <14>
- Xcode Ad Hoc和IOS Team Provisionig Profile之间有什么区别
- c – Q3ListView无法从Qt后备存储中取消注册或代码错误吗?
- c – 使用存储在向量中的对象的正确方法是什么?
- vue异步axios获取的数据渲染到页面的方法
- oracle rac启用归档模式
- ruby-on-rails – Rails – 由于“libMagickCore.5.dylib”