C语言中 指针做函数参数传递二维数组

Posted

tags:

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

编写一个函数(参数用指针)将一个3行3列的二维数组a转置后保存到一个二维数组b, 即将任意一个元素b[row][col]赋值为a[col][row]。
转置的举例:
1 2 3 转置后变成: 1 4 7
4 5 6 2 5 8
7 8 9 3 6 9

#include <stdio.h>

void fun(int (*p1)[3],int (*p2)[3]);

int main()

int p1[3][3]=7,8,9,4,5,6,1,2,3 ;

int p2[3][3] = 0;

int i = 0, j = 0;

fun(p1,p2);

for(i = 0;i < 3;i++)

for(j = 0;j < 3;j++)

printf("%d ",*(*(p2+i)+j));    

printf("\\n");

        

return 0;

void fun(int (*p1)[3],int (*p2)[3])

int i = 0,j = 0;

for(i = 0;i < 3;i++)

for(j = 0;j < 3;j++)

*(p2[j]+i) = *(p1[i]+j);

扩展资料:

函数指针的声明方法为:

返回值类型 ( * 指针变量名) ([形参列表]);

其中,“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:

int func(int x); /* 声明一个函数 */

int (*f) (int x); /* 声明一个函数指针 */

f=func; /* 将func函数的首地址赋给指针f */

或者使用下面的方法将函数地址赋给函数指针:

f = &func;

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

参考资料:

百度百科-函数指针

参考技术A

C语言中 指针做函数参数传递二维数组有两种基本方法:

1、传递“数组指针”

#include <stdio.h>
void output( int (*pa)[3], int n )//这个函数只能输出n行3列的二维数组

int i,j;
for( i=0;i<n;i++ )
for( j=0;j<3;j++ )
printf("%d ", pa[i][j] );
printf("\\n");


void main()

int a[2][3]=
1,2,3,
4,5,6
;
output(a,2);

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

#include <stdio.h>
void output( int *pa[], int row,int col ) //这个函数更通用,但调用前,要做好准备工作。

int i,j;
for( i=0;i<row;i++ )
for( j=0;j<col;j++ )
printf("%d ", pa[i][j] );
printf("\\n");


void main()

int a[2][3]=
1,2,3,
4,5,6
;
int i;
int *pa[2];
for( i=0;i<2;i++ )
pa[i]=a[i];
output(pa, 2, 3);

参考技术B //#include "stdafx.h"//vc++6.0加上这一行.
#include "stdio.h"
void myprint(int (*p)[3])
int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;printf("%3d",p[i][j++]));
printf("\n");


void mytranspose(int (*p)[3],int (*q)[3])
int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;q[j][i]=p[i][j++]);

int main(void)
int a[3][3]=1,2,3,4,5,6,7,8,9,b[3][3];
printf("Before the transpose:\n");
myprint(a);
printf("After the transpose:\n");
mytranspose(a,b);
myprint(b);
return 0;
本回答被提问者和网友采纳
参考技术C 简直将二维指针数组首地址传出去。 参考技术D 二维数组指针 (*p)[3]追问

实参就是a?~

数组参数和指针参数

1.C语言中只会以值拷贝的方式传递参数

2.当向函数传递数组时,将数组名看做常量指针传数组首元素地址

3.二维数组参数同样存在退化的问题,二维数组可以看做是一维数组,二维数组中的每个元素是一维数组

4.二维数组参数中第一维的参数可以省略

5.C语言中无法向一个函数传递任意的多维数组

6.为了提供正确的指针运算,必须提供除第一维之外的所有维长度

7.限制:一维数组参数-必须提供一个标志数组结束位置的长度信息

        二维数组参数-不能直接传递给函数

        三维或更多维数组参数-无法使用

#include <stdio.h>

void access(int a[][3], int row)
{
    int col = sizeof(*a) / sizeof(int);
    int i = 0;
    int j = 0;
    
    printf("sizeof(a) = %d\n", sizeof(a));
    
    for(i=0; i<row; i++)
    {
        for(j=0; j<col; j++)
        {
            printf("%d\n", a[i][j]);
        }
    }
}

int main()
{
    int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
    
    access(a, 3);
}


以上是关于C语言中 指针做函数参数传递二维数组的主要内容,如果未能解决你的问题,请参考以下文章

C语言函数传递二维数组

C语言学习笔记--数组参数和指针参数

数组参数和指针参数

C语言中如何将二维字符数组作为函数参数引用传递

c语言中怎么用二维数组作为函数参数

C 语言数组 ( 一维数组形参退化 | 二维数组形参退化 | 函数形参等价关系 )