C语言二维数组的定义、初始化、赋值

这种常规形式的数组一般使用不过二维,并且数组名很特殊,有跟指针以及地址有密不可分的关系,但是不一样,并且它使用数据的静态存储区。要使用大容量的动态内存,需要单独开辟,这里不做介绍,并且支持变量形式的申请。更多c语言数组基础知识可以翻看我之前画的博客。

先看一段代码

#include <stdio.h>
int main(){
    int i, j;  //二维数组下标
    int sum = 0;  //当前科目的总成绩
    int average;  //总平均分
    int v[3];  //各科平均分
    int a[5][3];  //用来保存每个同学各科成绩的二维数组
    printf("Input score:\n");
    for(i=0; i<3; i++){
        for(j=0; j<5; j++){
            scanf("%d", &a[j][i]);  //输入每个同学的各科成绩
            sum += a[j][i];  //计算当前科目的总成绩
        }
        v[i]=sum/5;  // 当前科目的平均分
        sum=0;
    }
    average = (v[0] + v[1] + v[2]) / 3;
    printf("Math: %d\nC Languag: %d\nEnglish: %d\n", v[0], v[1], v[2]);
    printf("Total: %d\n", average);
    return 0;
}

再看一段代码:

#include <stdio.h>
int main(){
    int i, j, k; 
    int a[2][5][3]={{ {1,2,3}, {2,3,4}, {3,4,5}, {4,5,6}, {5,6,7} }, { {10,20,30}, {20,30,40}, {30,40,50}, {40,50,60}, {50,60,70} }},;

    for(i=0; i<2; i++){
        for(j=0; j<5; j++){
            for(k=0; k<3; k++){
                printf("a[%d][%d][%d] = %d\n", i, j, k, a[i][j][k]);
                }
        }

    }
    return 0;
}

打印二维数组的三种方法

方法一:常规法
老老实实传二维数组。

void print1(int arr[3][5], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}
int main()
{
	int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10 };
	print1(arr, 3, 5);
	return 0;
}

 
 

    这段代码块,arr[3][5]里的3可省略,降维后与前一维度无关.但5不能省略,因为降维后的指针类型与元素个数有关,省略后指针会类型不明确.
    方法二:传指针法
    数组传参都会发生降维,降维成指向其内部元素的指针,因为二维数组被看成一个数组元素为一维数组的一维数组。所以在这里,二维数组arr降维成一个指向一维数组的指针,即(*arr)[5],这里与3也就没有任何关系了。

    void print2(int (*arr)[5], int row, int col)
    {
    	int i = 0;
    	int j = 0;
    	for (i = 0; i < row; i++)
    	{
    		for (j = 0; j < col; j++)
    		{
    			printf("%d ", arr[i][j]);
    		}
    		printf("\n");
    	}
    }
    int main()
    {
    	int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10 };
    	print2(&arr, 3, 5);
    	return 0;
    }
    
     
     

      方法三:一维数组打印法
      在我所总结的关于规律里,认为所有的不管几维数组,都可以被看为一维数组。所以二维数组就是一维数组,只不过里面的元素为一维数组。所以我想要通过一维数组来打印二维数组。这里假设打印一个3行3列的数组。arr[3][3].
      我们通过画图来找灵感:二维数组的下标我们很容易得到,现在问题是怎么得到这个一维数组的下标?我们先把我们需要的新下标列出来,然后再来寻找i,j和新下标之间的关系,通过观察我们能得到:新下标=i*row+j
      在这里插入图片描述
      那么代码如下:

      void print3(int *arr, int row, int col)
      {
      	int i = 0;
      	int j = 0;
      	for (i = 0; i < row; i++)
      	{
      		for (j = 0; j < col; j++)
      		{
      			printf("%d ", arr[i*row+j]);
      		}
      		printf("\n");
      	}
      }
      int main()
      {
      	int arr[3][3] = { 1,2,3,4,5,6,7,8,9};
      	print3(arr, 3, 3);
      	return 0;
      }
      
       
       

        参考:

        https://blog.csdn.net/qq_42913794/article/details/89604323
        http://c.biancheng.net/view/1829.html

        • 11
          点赞
        • 51
          收藏
          觉得还不错? 一键收藏
        • 1
          评论

        “相关推荐”对你有帮助么?

        • 非常没帮助
        • 没帮助
        • 一般
        • 有帮助
        • 非常有帮助
        提交
        评论 1
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

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

        抵扣说明:

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

        余额充值