指针函数二维数组之间的联系

Posted andyalgorithm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针函数二维数组之间的联系相关的知识,希望对你有一定的参考价值。

1.传递数组指针

 1 #include <stdio.h>
 2 void output( int (*pa)[3], int n )//这个函数只能输出n行3列的二维数组
 3 {
 4     int i,j;
 5     for( i=0;i<n;i++ ){
 6         for( j=0;j<3;j++ )
 7             printf("%d ", pa[i][j] );
 8         printf("\n");
 9     }
10 }
11 void main()
12 {
13     int a[2][3]={
14         {1,2,3},
15         {4,5,6}
16     };
17     output(a,2);
18 }

2.传递“指针数组”  先将二维数组的行指针存储到一个指针数组中,再将指针数组传递到子函数中去

 1 #include <stdio.h>
 2 void output( int *pa[], int row,int col ) //这个函数更通用,但调用前,要做好准备工作。
 3 {
 4     int i,j;
 5     for( i=0;i<row;i++ ){
 6         for( j=0;j<col;j++ )
 7             printf("%d ", pa[i][j] );
 8         printf("\n");
 9     }
10 }
11 void main()
12 {
13     int a[2][3]={
14         {1,2,3},
15         {4,5,6}
16     };
17     int i;
18     int *pa[2];
19     for( i=0;i<2;i++ )
20         pa[i]=a[i];
21     output(pa, 2, 3);
22 }

对于二维数组作为变量存在于函数中,有如下情况:

void Func(int array[3][10]); 
void Func(int array[][10]); 
void Func(int(*array)[10]);

 


如果要取p[i][j]的值,编译器是这样寻址的,它的地址为:

p + i*n + j;

void Func(int array[3][10]);

void Func(int array[][10]);

变为:

void Func(int **array, int m, int n);

在转变后的函数中,array[i][j]这样的式子是不对的(不信,大家可以试一下),因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为:

*((int*)array + n*i + j);

在调用这样的函数的时候,需要注意一下,如下面的例子:

int a[3][3] =

{

{1, 1, 1},

{2, 2, 2},

{3, 3, 3}

};

Func(a, 3, 3);

根据不同编译器不同的设置,可能出现warning 或者error,可以进行强制转换如下调用:

Func((int**)a, 3, 3);

 
 

以上是关于指针函数二维数组之间的联系的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV二维Mat数组(二级指针)在CUDA中的使用

C 语言二级指针作为输入 ( 二维数组 | 抽象业务函数 | 二维数组打印函数 | 二维数组排序函数 )

void函数指针的二维数组c ++

指针与一维数组和二维数组以及字符串指针数组的学习笔记

知识分享:C/C++函数返回二维数组指针

c语言中如何通过二级指针来操作二维数组