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

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);
时间: 2024-10-25 08:15:48

指针、函数、二维数组之间的联系的相关文章

关于指针与二维数组之间的那些事

int a[2][3]={{1,2,3},{4,5,6}} (*p)[3]=a; 若引用数组第二行第二列元素的值,则下列不正确的表达式为 A:*(*(a+1)+1) B:*(*(p+1)+1) C:*(*(++a)+1) //错误 D:*(*(++p)+1) 解析:因为数组名a是一个常量,而p是一个变量,a可以a+1,但不能++a,但p可以 拓展:类型符说明 (*指针变量名)[长度] int (*p)[4]   *p有4个元素,每个元素都为整型 p所指的对象是有四个整型元素的数组 *(p+2)+

二级指针与二维数组

最近看<Linux C程序设计大全>这本书,虽然书中有一些错误,但整体来说,书写得还算可以. 当看到网络编程[第23.2.4小节 获得主机信息]时,遇到了一段代码,原文如下: “一台主机有许多和网络相关的信息,例如,主机名称.IP地址.主机提供的服务等.这些信息一般都保存在系统中的某个文件里(例如/etc/hosts等),用户程序可以通过系统提供的函数读取这些文件上的内容.Linux环境下使用gethostent函数读取和主机有关的信息,该函数的原型如下: 1 #include <net

指针和二维数组

指针和二维数组 首先定义一个数组: 1 int a[5][3] = { {1,6,11}, 2 {2,7,12}, 3 { 3,8,13 }, 4 { 4,9,14 }, 5 { 5,10,15 } 6 }; 随便定义的一个二维数组i = 5, j = 3 然后看下面3种方式: 1 int *b = a[0]; 2 int *c = *a; 3 int &d = **a; 其实上面的三种方式的效果是一样的,大牛一看就知道,这不是废话么.我们还是输出下 1 //value 2 std::cout

指针与二维数组间的关系

1.四种表示a[i][j]的形式是等价的: a[i][j]==*(a[i]+j)==*(*(a+i)+j)==(*(a+i))[j] 2.通过行指针p引用二维数组a的元素a[i][j]的方法可用以下4种等价形式: p[i][j]==*(p[i]+j)==*(*(p+i)+j)==(*(p+i))[j] 3.对指向二维数组的行指针p进行初始化的方法: p=a 或p=&a[0] 4.对指向二维数组的列指针进行初始化的方法(以下三种方法等价): p=a[0] 或 p=*a 或 p=&a[0][0

例看二维数组,指针,二维数组指针

例程: /****************************************************** * * 文件名:例程 * * 文件描述:例看二维数组,指针,二维数组指针 * * 创建人:Jesse * * 版本号: * * 修改记录: * ******************************************************/ #include <stdio.h> #define ROW 3 #define LINE 3 void main(voi

C语言编程 子函数中利用指针输出二维数组

一般输出方式:void print1(int arr[][3], int row, int col){int i, j;for (i = 0; i < row; i++){for (j = 0; j < col; j++){printf("%d", arr[i][j]);}printf("\n");}} 指针输出方式:void print2(int arr, int row, int col){int i, j;for (i = 0; i < ro

数组指针与二维数组的寻址

引例:已知如下程序 1 #include <stdio.h> 2 main() 3 { 4 int x[3][4] = {1,3,5,7,9,11,2,4,6,8,10,12} ; 5 int (*p)[4] = x, k = 1, m, n = 0; 6 for(m=0; m < 2; m++) 7 n += *(*(p+m)+k); 8 printf("%d\n",n); 9 } 试写出程序的输出值.(虽然我很讨厌做这种笔头功夫的题,我也坚信编程语言是在实践中练出

c语言指针与二维数组

1 指针数组 例子: int i,j; int x[2][3]={{1,2,3},{4,5,6}}; int *p[2]={x[0],x[1]};//声明一个含有2个元素的一维int指针数组p for(i=0;i<2;i++) { for(j=0;j<3;j++) { cout<<*(p[i]+j)<<endl; } } 输出语句为cout<<p[i][j]<<endl;也是可以的. int i,j; int x[2][3]={{1,2,3},{

指针和二维数组的关系

指针引用多维数组 int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}};                    二维数组 a[0]  == 1 2 5 7 a[1]  == 9 11 13 15 a[2]  == 17 19 21 23 OK,二维数组在我们眼中,相当于三个一维数组组成:a代表着 二维数组的首地址. 而在二维数组中需要我们特别注意的是 a+1 指向其实是a[1]的地址. 我们在例子中设置的是 “INT” 类型的,在32位 vs中