写在前面
- 📝 个人主页:泽奀的博客_CSDN博客
- 🆔 本文由 泽En 原创,CSDN首发🐒,如需转载还请通知⚠
- 🏆 嵌入式领域新星创作者 & 作者周榜: 43 & 总排名: 3343 👑
- 🎉 欢迎 点赞 ➕ 评论 ➕ 收藏 == 养成习惯😜
- 📣 系列专栏:【C】系列_泽奀的博客-CSDN博客
- 💬 总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊
- ✉️ 我们并非登上我们所选择的舞台,演出并非我们所选择的剧本 ♦
目录
练习1:一个学习小组有 5 个人,每个人有三门课的考试成绩。求全组分科的平均成绩和 各科总平均成绩。
前面的博客介绍了一维数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。我们在实际问题当中很多量是由二维或者是多维的,因此 C 语言允许构造了多维数组。多维数组的元素有多个下标,以标识它的数组中的位置,所以也称为多下标变量。本片文章介绍的是二维数组。
二维数组的声明与一维数组相同,一般形式如下:
- 类型说明符 数组名 [常量表达式 1] [常量表达式 2];
其中 "常量表达式1" 被称之为行下标,"常量表达式2" 被称之为是列下标。二维数组下标的取值范围,如下所示:
- 行下标的取值范围是:0~n-1。
- 列下标的取值范围是:0~m-1。
- 二维数组最大元素下标识:array[n-1][m-1]。
例如:定义一个2行3列的整型数组
- int array[3][3]
上述代码声明了一个 3 行 3 列的二维数组,其 数组名 是 array,其下标变量的类型为整形。
如下图所示:该数组的下标变量一共有 3x3 个。

在 C语言中,二维数组是按行排列的,即按行顺序存放,先存放 array[0] 行,再存放 arrar[1] 行,接着存放 array[2] 行。每行有 3 个元素,也是其依次存放的。
注意:在C语言中,二维数组是按行排列的。
二维数组元素的引用一般形式如下:
- 数组名[下标][下标];
说明:二维数组的下标可以是 整形常量 或 整形表达式。
- 例如: a[3][4];表示 a 数组三行四列的元素。
下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。
- 注意:不管是 行下标 还是 列下标,其中的索引值都是从 0 开始的。
- 注意:和一维数组是一样的,我们都需要注意下标越界的问题。
如下代码所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i, j; //二维数组下标
int sum = 0; //当前科目的总成绩
int average; //总平均分
int v[3]; //各科平均分
int a[3][5]; //用来保存每个同学各科成绩的二维数组,三门学科,五个同学。
printf("请输入各科学生的成绩:\n");
for (i = 0; i < 3; i++)
{
printf("\n一门学科数入5次成绩\n");
if (i == 0)
printf("数学学科:");
if (i == 1)
printf("语文学科:");
if (i == 2)
printf("英语学科:");
for (j = 0; j < 5; j++)
{
scanf("%d", &a[i][j]); //输入每个同学的各科成绩
sum += a[i][j]; //计算当前科目的总成绩(sum)
}
v[i] = sum / 5; // 当前科目的平均分,用总的成绩除以5
sum = 0; // 把当前科目总成绩清0
}
average = (v[0] + v[1] + v[2]) / 3;
printf("\n数学: %d\n语文: %d\n英语: %d\n", v[0], v[1], v[2]);
printf("平均分: %d\n", average);
return 0;
}
当上面的代码被编译和执行时,可能它会产生下列结果:

二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值, 也可按行连续赋值。下面是一个带有 3 行 4 列的数组:
- 按行分段赋值可写为。
int a[3][4] = {
{0, 1, 2, 3} , /* 初始化索引号为 0 的行 */
{4, 5, 6, 7} , /* 初始化索引号为 1 的行 */
{8, 9, 10, 11} /* 初始化索引号为 2 的行 */
};
- 按行连续赋值可写为,注意:这个与上面初始化是等同的。
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
int val = a[2][3];
如下代码所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
int i, j;
int arr[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("arr[%d][%d] = [%d] [%p]\n", i, j, arr[i][j], &arr[i][j]);
}
printf("\n");
}
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果。线性、连续、且递增。

1.可以只对部分元素赋值,未赋值的元素自动取"0"值。例如:
int arr[3][3] = {{1,2},{2,3},{3,4}};
是对每一行的第一列元素赋值,未赋值的元素的值为 0。赋值后各元素的值为:
1 2 0
2 3 0
3 4 0
2.如果对全部元素赋值,那么第一维的长度可以不给出。例如:
int arr[3][3] = {{1,2,3},{2,3,4},{3,4,5}};
还可以写成为是:
int arr[][3] = {{1,2,3},{2,3,4},{3,4,5}};
注意:行 是可以进行省略的,但是 列 不能进行省略。
3. 二维数组可以看作是由一维数组嵌套而成的;如果一个数组的每个元素又是一个数组,那么它就是二维数组。当然,前提是各个元素的类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组,C语言允许这种分解。
- 例如,二维数组
a[3][4]可分解为三个一维数组,它们的数组名分别为 a[0]、a[1]、a[2]。- 这三个一维数组可以直接拿来使用。这三个一维数组都有 4 个元素,比如,一维数组 a[0] 的元素为 a[0][0]、a[0][1]、a[0][2]、a[0][3]。
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题: