关于作为函数参数的多维数组的声明、定义和调用

编写C代码的过程中,有时需要在主调函数中将多维数组传给被调函数,此时数组在被调函数中需要充当一次形参和一次实参。在这里,我使用myarray[3][3]作为所讨论的数组。

网上已经给出很多例子来说明当调用和被调用函数都在一个源文件中的情形。在这种情况下,被调用函数形参中不需要指定所调用数组的第一个下标,但需要指定第二个下标,也就是说用myarray[][3]这种形式即可。

然而,当调用和被调用函数不在一个文件中时,就需要用特定的方式来处理了,下面给出例子:

1 void print_my_array(int (*myarray)[3])
2 {
3     for (int i=0; i<=2; ++i) {
4         printf("", myarray[i][0], myarray[i][1], myarray[i][2]);
5     }
6 }

该被调函数处于file1.c中,在file1.h中对其进行声明:

1 #ifndef __file1_h
2 #define __file1_h
3
4 #include <stdio.h>
5
6 void print_my_array(int (*)[3]);
7
8 #endif

在主函数main中进行调用时,调用函数中的实参中无需使用下标,直接用数组名即可。

 1 #include <stdio.h>
 2 #include "file1.h"
 3
 4 int main(int argc, char *argv[])
 5 {
 6     int myarray[3][3];
 7
 8     pirnt_my_array(myarray);
 9
10     return 0;
11 }

对上面的例子需要解释的时,被调函数中的形参使用了 int (*myarray)[3] 这种形式,显式地把多维数组表达成一个指针数组。这种方式的好处就是在声明中可以很简单的用 void print_my_array(int (*)[3]); 来声明。

时间: 2024-11-06 01:09:18

关于作为函数参数的多维数组的声明、定义和调用的相关文章

c语言中二维数组作函数参数以及二维数组的理解

当二维数组作函数参数接受主调函数中的二维数组时,退化为一个指向数组的指针. 在此引用<c与指针>中的观点:作为函数 参数的多位数组名的穿递方式和一维数组名相同--实际传递的是个指向数组第一个元素的指针.但是,两者之间的区别在于, 多维数组的每个元素本身是另外一个数组,编译器需要知道它的维数,以便为函数形参的下标表达式进行求值.

c语言 函数返回二位数组 函数参数为二维数组

通过typedef可以简单实现.也可以直接写. 写了两个简单的矩阵操作的函数简单示例. #include <stdio.h> #include <stdlib.h> const int ROW = 3; const int COL = 4; typedef int (* mat_pointer)[COL]; mat_pointer init_mat(mat_pointer a) { for (int i = 0; i < ROW; ++i) for (int j = 0; j

&lt;16&gt;【理解】数组元素作为函数参数+【掌握】数组名作为函数参数+【掌握】数组名作为函数参数的注意点

#include <stdio.h> int sum(int x,int y){ return x+y; } void printNum(int x){ //判断x的值 if (x>0) { printf("%d\t",x); }else{ printf("0\t"); } } int main(int argc, const char * argv[]) { int a[5]={1,-2,-3,-4,5}; //需求:要求计算数组的第一个元素和最

C++二维数组讲解、二维数组的声明和初始化

我们知道,一维空间是一条线,数学中用一条数轴来表达:二维空间是一个平面,数学中用平面坐标系来表达.那么二维数组又是什么样的呢? 线与面 我们用一个下标来描述一维数组中的某个元素,就好像在用数描述一条线上的点.而所有的数据都是存储在一条线上.如果我们采用两个下标,就能形成一个平面,犹如一张表格,有行有列,所有的数据就能够存放到表格里. 我们把二维数组的两个下标分别称为行下标和列下标,在前面的是行下标,在后面的是列下标. 那么什么时候要用二维数组呢?一般有两种情况,一种是描述一个二维的事物.比如用1

关于offsetWidth,offsetHeight,offsetTop,offsetLeft和二维数组的声明

offsetWidth,offsetHeight,offsetTop,offsetLeft 为只读状态,返回的值是int形式 只读形式即不能通过修改其值的大小. 想要修改某元素的这些值的大小(width,height,top,left) 可以使用一下方法 elementId.style.width = '20px'; elementId.style.height = '40px'; elementId.style.left = '20px'; elementId.style.top = '10p

7.Java二维数组的声明、初始化和引用

二维数组的声明.初始化和引用与一维数组相似,这里不再详讲. 二维数组的定义 type arrayName[ ][ ]; type [ ][ ]arrayName; 只是形式上的差别,大家可以根据自己的习惯来选择. 二维数组的初始化 1.静态初始化     int intArray[ ][ ]={{1,2},{2,3},{3,4,5}}; Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同. 2.动态初始化 1) 直接为每一维分配空间,格式如

二维数组(声明以及遍历)

首先图面理解二维数组(数组里面的元素不是字符或者数字类型而是另外一个数组)! 一,二维数组的声明 int[ ] [ ] arr; 初始化一个能存3个一维数组的二维数组 arr = new int [3] [ ];  (此时只声明了一个二维数组的空间,并没有声明一维数组的空间哈!!) 赋值: [3]赋值 int[] arr1 = {1,3,4,5}; int[] arr2 = {1,3,4}; int[] arr3 = {2,1,6,4}; arr[0] = arr1; arr[1] = arr2

参数 存在二维数组

声明函数如下void function(int** p),意图是想参数传递一个二维数组.于是就定义了一个二维数组,比如 int a[1][1],然后调用函数.结果如何?当然是失败了,编译器提示:cannot convert parameter 1 from 'int [1][1]' to 'int **',参数类型不匹配.上述过程我自己也试了,当然不匹配,类型完全不一样嘛.然后我就想了:如果要将一个二维数组作为形参,那么函数该怎么声明? 简单点 数组名作为形参 void func1(int Ar

向函数中传输二维数组

void xxx (int **a, int r . int c){ // r代表行 , c代表列 //在转变后的函数中,array[i][j]这样的式子是不对的,因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为 *( (int*) a + c* (i)  +  (j) ); } int a[3][3] =     {      {1, 1, 1},      {2, 2, 2},      {3, 3, 3}    }; xxx( (int