C语言中用指针传递二维数组

二级指针与二维数组

int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };//二维数组
//二维数组在概念上是二维的,有行和列。
//但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。
//a[0][3]与a[1][0]地址相邻

int *p = &a[0][0]//一级指针指向单个地址


int *p[3];//指针数组,下有3个指针
// 指针数组是数组元素为指针的数组,其本质为数组。
//(例如 int *p[3],定义了p[0],p[1],p[2]三个指针)


int (*p)[5] = a;//数组指针
//数组指针指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。

int **p;//二级指针,指向一级指针的地址

       显然不能用二级指针直接传递二维数组,可采用以下方法

1.数组指针传递

#include<stdio.h>
int sum(int (*a)[3],int x){
    //列数已经固定
    //int (*a)[3]也可写作int a[][3],可读性更高
	int s=0,i,j;
	for(i=0;i<x;i++){
		for(j=0;j<3;j++){
			s+=a[i][j];
		}
	}
	return s;
}
int main()
{
	int a[21][3],n,i,j;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		for(j=0;j<3;j++){
			scanf("%d",&a[i][j]);
		}
	}
	printf("%d\n",sum(a,n));
	return 0;
}

   2.指针数组传递

#include<stdio.h>
int sum(int **a,int n,int m){
	//此处**a也可写为*a[]
    //*p[]在传递时退化为指针,即指针数组的指针
	int s=0,i,j;
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			s+=a[i][j];
		}
	}
	return s;
}
int main()
{
	int a[21][21],n,i,j,m;
	int *p[21];
	scanf("%d%d",&n,&m);
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			scanf("%d",&a[i][j]);
		}
	}
	for(int i=0;i<n;i++) p[i]=a[i];
	printf("%d\n",sum(p,n,m));
	return 0;
}

        

  • 10
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值