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

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

   最常用的方式

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");
    }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值