多维数组在函数中的使用和传参

  二维数组在C语言中,如果是使用int a[2][2]={{1,2},{5,4}} 之类的初始化的,其实在内存中也是一段连续的内存,只是在使用上区别,因为c语言需要知道你操作的是一个二维数组。

    关于二维数组的在函数中传参使用,其实主要是指针类型 的声明

    int *p[2]; 在c中定义一个这样的指针,他表示的是指针数组,因为标准c中默认[]优先级高于*。p先和[]结合,表明它是一个数组,数组元素类型是int*、

    int (*p)[2].因为有() 优先级高于[],所以p和*先结合,此时p表示一个指针,其类型是指向一个int (*)[2]。(*对已一个int a[2]数组,对其数组名直接引用,a是一个int*类型,而通过&a取地址符引用,他表示一个int  (*)[2]类型,也就是表示指向数组的指针。直接对数组名引用,是一个指向数组首元素的int*类型。)

    对于二维数组,如int a[2][3],a数组名,在codeblocks下使用gcc编译器,会认为是int (*)[3] 类型。表示指向的是一个int (*)[3]数组。正好等同于二维数组定义【二维数组,就是数组中的元素是一个一维数组,作这个理解,比较容易操作2维数组】。而a[0]则表示int*类型。同上,对&a取地址操作,得到的是int (*)[2][3]指针类型。而对&a[0]取地址操作,得到的是int (*)[3] 指针类型。

    看下面的代码,一般通过int [2][3]等类型初始化的数组,可以使用int (*)[3] 的类型参数作为函数形参。直接使用int a[2][3]作为形参也是可以的。


[cpp]  view plain  copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. void show(int* *a)  
  4. {  
  5.     //函数中使用int** 类型,可以作为一个动态的二维数组使用  
  6.     printf("%d\n",**a);  
  7. }  
  8. //参数类型使用int (*a)[2]的形式来引用二维数组变量。其中涉及到指针类型的转换。  
  9. void sshow(int (*a)[2])  
  10. {  
  11.     //使用int [][]声明的数组,在内存中的分配其实是一连串的内存数据,所以要  
  12.     //访问int [][]这种的二维数组,需要声明int (*a)[2] 的基类型,这样c才能知道数组中的维数。  
  13.     printf("%d\n",**a);  
  14. }  
  15. //传参数中的int a[]  其实和int *a访问一样,操作也和指针操作一样  
  16. void show2(int a[])  
  17. {  
  18.     //参数中传递int* a  和int a[]效果一样  
  19.     printf("%d\n",*a);  
  20.     printf("%d\n",a[0]);  
  21. }  
  22. int main()  
  23. {  
  24.     //二维数组  
  25.     int n1[2][3]={{1,2},{4,8,4}};  
  26.     //一维数组  
  27.     int np1[2]={11,23};  
  28.     int np2[2]={64,25};  
  29.   
  30.     //指针数组,指针数组和2维数组不同,指针数组,其实是数组中存放的是指针类型  
  31.     //而2维数组,使用这种情况分配的话,int n1[2][2]={{1,2},{4,8}}; 其实在内存中还是连续的int数据。  
  32.     int *p[2]={np1,np2};  
  33.     //使用指针数组 p[1]表示数组中第二个int*指针。通过解引用这个指针可以访问指针内容。  
  34.     //*(p[1]+1) 访问指针指向的下一个int数据  
  35.     printf("%d\n",*(p[1]+1));  
  36.   
  37.     //int指针 此时通过n就可以访问一维数组np1内容  
  38.     int *n=np1;  
  39.   
  40.     //指向int指针的指针 并指向np1数组首地址。  
  41.     int **rp;  
  42.   
  43.     //通过calloc来动态分配内容给指针  
  44.     //先动态分配2个int*类型。calloc返回的总是void*,这里返回的是一个int**指针,指针  
  45.     //指向的内存中存放的是2个连续地址,地址内容是int*指针,calloc分配的默认此int*指针地址值为0  
  46.     rp=calloc(2,sizeof(int*));  
  47.     //动态分配一个指针给rp执行内存中的int*指针,此指针指向2个连续的地址单元,大小为int。初始值为0  
  48.     *rp=calloc(2,sizeof(int));  
  49.     //同样分配第二个  
  50.     *(rp+1)=calloc(2,sizeof(int));  
  51.     //通过2级解引用指针,给其中一个int单元赋值。  
  52.     **rp=5;  
  53.   
  54.     //int** 指针当数组使用 说明标准c中默认数组访问和指针是相通的。  
  55.     printf("%d\n",rp[0][0]);  
  56.     show(rp);  
  57.     show2(n);  
  58.     return 0;  
  59. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值