现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

如何将二位数组作为参数传入函数

2013-11-19 23:02 工业·编程 ⁄ 共 2095字 ⁄ 字号 暂无评论

今天看见了四种方式://夜晚回来后,又仔细查了资料发现,这个问题还真是个问题,我总结了下总共有八种方式,这里再继续添加四种,重在理解原理。

>>>数组参数传递中的一些问题

   最常用的方式

1  、 f(int (*p)[4],int n);

    int a[3][4];

     f(a,n);

2、f(int p[][4],int n)//这里p[]相当于*p

int a[3][4];

f(a,n);

//前两种方式是最为推荐的

3、f(int p[4][4],int n)//这里的p[4][4]中第一个位置编译器将默认为[],相当于这种情况与第三种是等价的,编译器默认忽略第一个位置的4

int a[3][4];

f(a,n);

4、f(int **p,int row,int col);

int a[3][4];

f((int**)a,3,4);

里面用a[i][j]的时候要写成

*((int *)a+i*row+j)

5.、f(int [][4],int n)

int a[3][4];

f(a,n);

//同类型3,只是可以省略名称

6、c99特性中增加了可以使用vla,即变长数组,所以可以如下声明

f(int rows,int cols,int a[rows][cols]);

其中rows,cols,分别是其后a数组的行和列。

这里变长数组,不是说创建之后,可以修改其大小、变长数组在声明后大小是不变的,变的意思是,它的维数可以有变量来指定。

所以如下声明是错误的,

f(int a[rows][cols],int rows,int cols);//顺序错误

7、c99中规定,可以省略函数原型中的名称,但是如果省略名称,则需要用星号来替代省略的维数。

f(int ,int ,int a[*][*]);

8,可以利用自定义类型
typedef int arr4[4];
typedef arr4 arr3X4[3];
f(arr3x4 ar,int rows);
一般地,声明N维数组的指针时,除了最左边的方括号可以留空之外,其他的都要填写上数值
这是因为首方括号表示这是一个指针,而其他方括号描述的是所指向对象的数据类型。

int f(int ar[][12][20][130],int rows);
int f(int (*ar)[12][20][130],int rows);
此处ar是指向一个12x20x130的int数组。

//test array
#include<stdio.h>
#include<stdlib.h>
void test_01(int (*p)[4],int times){
    printf("It is the %d test.\n",times);
    for(int i=0;i<3;i++){
        for(int j=0;j<4;j++)
        printf("%d ",p[i][j]);
        printf("\n");
        }
    }
void test_02(int p[][4],int times){
    printf("It is the %d test.\n",times);
    for(int i=0;i<3;i++){
        for(int j=0;j<4;j++)
        printf("%d ",p[i][j]);
        printf("\n");
        }
    }
void test_03(int p[3][4],int times){
    printf("It is the %d test.\n",times);
    for(int i=0;i<3;i++){
        for(int j=0;j<4;j++)
        printf("%d ",p[i][j]);
        printf("\n");
        }
    }
void test_04(int **p,int row,int col,int times){
    printf("It is the %d test.\n",times);
    for(int i=0;i<3;i++){
        for(int j=0;j<4;j++)
        printf("%d ",*((int *)p+i*col+j));
        printf("\n");
        }
    }
int main(){
   
    int a[3][4];
    for(int i = 0;i < 3;i++){
        for(int j=0;j < 4;j++)
        a[i][j]=i+1;
        }
    for(int i=0;i<3;i++){
        for(int j=0;j<4;j++)
        printf("%d ",a[i][j]);
        printf("\n");
        }
    printf("Initnation is prossing .....");
    system("pause");
    test_01(a,1);
    test_02(a,2);
    test_03(a,3);
    test_04((int **)a,3,4,4);
    system("pause");
    }

给我留言

留言无头像?