C语言学习之二维数组的传参

    写c语言的时候,遇到一个这样的问题:求一个3*3整型矩阵对角线元素之和。首先入手点是二维数组,于是我很快便写好了以下代码

#include <stdio.h>
#include <stdlib.h>

int Sum(int p[][3])
{
	int sum=0;
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<3;j++)
		{
			if(i==j||i+j==2)
			{
				sum+=p[i][j];
			}
		}
	}
	return sum;
}

int main()  
{
    int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int sum=Sum(a);
    printf("%d ", sum);
    system("pause");
    return 0;
}

但是我想到如果只写这么一个函数,那么我就只能针对3*3的对角线之和的问题(不考虑长方形),但是我的初衷并不是这样。我希望写出这个函数的同时,可以对任意n²的矩阵都可以进行对角线和的输出,我觉得当定义一个二维数组的时候,和定义一维数组的形式和内存都是一段,二维数组只是设置了几个不同的几个记录来进行保存行列的值,所以在进行*(*p+1)和**(p+1)的时候来区分如以下情况

int main()    
{  
    int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
    printf("%d %d %d %d", **a, **(a + 1), *(*a + 1), **a + 1);  
    printf("%d ", sum);  
    system("pause");  
    return 0;  
}
因为二维数组的地址是连续存放的所以我打算在子函数里接收一个指向二维数组的二级指针int **arr和它的矩形的边值len,然后用人工的方式进行划分二维数组的区域,就有以代码

int  Sum1(int **p,int n)  
{  
    int sum = 0;  
    for (int i = 0; i < n-1; i++)  
    {  
        for (int j = 0; j < n-1; j++)  
        {  
            if (i == j || i + j == n-1)  
            {  
                sum += *(*p + i*(n - 1) + j);  
            }  
        }  
    }  
    return sum;  
}  
当我调用这个函数时首先就发生中断的情况,我发现我的理解有错误,既然相当于一维数组,那应该用一维指针就可以,而且在循环的过程因为受二维数组的影响,再循环的时候条件也有些错误,下面是我修改后的代码
int  Sum1(int *p,int n)  
{  
    int sum = 0;  
    for (int i = 0; i < n; i++)  
    {  
        for (int j = 0; j < n; j++)  
        {  
            if (i == j || i + j == n-1)  
            {  
                sum += *(p + i*(n ) + j);  
            }  
        }  
    }  
    return sum;  
}  

经过调用我发现就可以调用了,就是在调用的时候,因为二维数组并不是一个单纯的一级指针,所以在运行传参的时候需要一个强制转换的过程(int *),我想要取消这个强制转换的过程,做的更友好些,但是以我现在的思想和水平,还没有一个更好的方法,等今后有更好的方法或者新的思路,再重新写这个函数。

2017.8.24

可以用动态开辟的方法来创建数组,

    int **cheil = (int **)malloc(sizeof(int*)* 5);  //动态开辟二维数组存放数据  
    for (i = 0; i < 5; i++)  
    {  
        cheil[i] = (int *)calloc(4, sizeof(int));  //初始化  
    }
这样传入的指针是一个二级指针,就不需要强制转换了,但是又需要用户自己动态开辟才可以调用,不是动态开辟的数组一样还是用不了,继续学习,可能还会有新的方法吧。



  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值