精华内容
下载资源
问答
  • C语言二维数组
    千次阅读
    2021-05-23 04:55:03

    本篇文章帮大家学习c语言二维数组,包含了C语言二维数组使用方法、操作技巧、实例演示和注意事项,有一定的学习价值,大家可以用来参考。

    C语言中的二维数组以行和列的形式表示,也称为矩阵。 它也被称为阵列数组或数组列表。

    二维,三维或其他维度数组也称为多维数组。

    二维数组声明

    我们可以用以下方式在C语言中声明一个数组。

    data_type array_name[size1][size2];

    下面给出一个简单的例子来声明二维数组。

    int twodimen[4][3];

    这里,4是行号,3是列号。

    二维数组的初始化

    在声明时初始化二维数组的方法如下 -

    int arr[4][3]={{1,2,3},{2,3,4},{3,4,5},{4,5,6}};

    二维数组示例

    创建一个源文件:dimensional-array.c,其代码如下所示-

    #include

    void main() {

    int i = 0, j = 0;

    int arr[4][3] = { { 1,2,3 },{ 2,3,4 },{ 3,4,5 },{ 4,5,6 } };

    //traversing 2D array

    for (i = 0;i<4;i++) {

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

    printf("arr[%d] [%d] = %d \n", i, j, arr[i][j]);

    }//end of j

    }//end of i

    }

    执行上面示例代码,得到以下结果 -

    arr[0] [0] = 1

    arr[0] [1] = 2

    arr[0] [2] = 3

    arr[1] [0] = 2

    arr[1] [1] = 3

    arr[1] [2] = 4

    arr[2] [0] = 3

    arr[2] [1] = 4

    arr[2] [2] = 5

    arr[3] [0] = 4

    arr[3] [1] = 5

    arr[3] [2] = 6

    更多相关内容
  • C语言中,二维数组的参数传递。 例如: char str[5][100]; 如果作为参数传递,内有详细示例。 三种传参示例供参考。
  • 有下面这样的一个二维表,请将其使用二维数组输出 姓名 语文 数学 英语 张三 80 70 90 李四 40 50 90 王五 90 98 100 题解 与几位童鞋交流了一下发现他们都把汉字单独拿出来了,只用数组存储的成绩,...
  • C语言二维数组学习教案.pptx
  • 主要介绍了C语言二维数组中的查找的实例的相关资料,需要的朋友可以参考下
  • (2)、第二种是用一维数组来表示二维数组,从显示的元素地址可以看出,二维数组和一维数组表示的二维数组在内存中的储存方式其实是一样的,不过使用二维数组看起来要简单些,只要不用进行地址转换。 (3)、第三...
  • 二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,...C语言中的二维数组是按行排列的,也就是先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行;每行中的 4 个元素也是依次存放。数组 a
  • c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度。 例如: #include void func(int n, char str[ ][5] ) { int i; for(i = 0; i < n; i++) printf("/nstr...
  • 主要介绍了C语言二维数组的指针指向问题,文中不建议用二级指针来访问二维数组,需要的朋友可以参考下
  • C语言二维数组PPT课件.pptx
  • C语言二维数组的定义和引用C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。下面是小编分享的C语言二维数组的定义与引用,欢迎大家...

    C语言二维数组的定义和引用

    C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。下面是小编分享的C语言二维数组的定义与引用,欢迎大家参考!

    C语言二维数组的定义和引用

    一维数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量。本节只介绍二维数组,多维数组可由二维数组类推而得到。

    二维数组的'定义

    二维数组定义的一般形式是:

    类型说明符 数组名[常量表达式1][常量表达式2]

    其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。例如:

    int a[3][4];

    说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3×4个,即:

    a[0][0], a[0][1], a[0][2], a[0][3]

    a[1][0], a[1][1], a[1][2], a[1][3]

    a[2][0], a[2][1], a[2][2], a[2][3]

    二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列, 即放完一行之后顺次放入第二行。另一种是按列排列, 即放完一列之后再顺次放入第二列。

    在C语言中,二维数组是按行排列的。即,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节。

    二维数组元素的引用

    二维数组的元素也称为双下标变量,其表示的形式为:

    数组名[下标][下标]

    其中下标应为整型常量或整型表达式。例如:

    a[3][4]

    表示a数组三行四列的元素。

    下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。

    【例7-6】一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。--张王李赵周

    Math8061598576

    C7565638777

    Foxpro9271709085

    可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量average 为全组各科总平均成绩。编程如下:

    #include int main(void){ int i,j,s=0,average,v[3],a[5][3]; printf("input score

    "); for(i=0;i<3;i++){ for(j=0;j<5;j++){ scanf("%d",&a[j][i]); s=s+a[j][i]; } v[i]=s/5; s=0; } average =(v[0]+v[1]+v[2])/3; printf("math:%d

    c languag:%d

    dbase:%d

    ",v[0],v[1],v[2]); printf("total:%d

    ", average ); return 0;}

    程序中首先用了一个双重循环。在内循环中依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来,退出内循环后再把该累加成绩除以5送入v[i]之中,这就是该门课程的平均成绩。外循环共循环三次,分别求出三门课各自的平均成绩并存放在v数组之中。退出外循环之后,把v[0]、v[1]、v[2]相加除以3即得到各科总平均成绩。最后按题意输出各个成绩。

    二维数组的初始化

    二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。

    例如对数组a[5][3]:

    按行分段赋值可写为:

    int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };

    按行连续赋值可写为:

    int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};

    这两种赋初值的结果是完全相同的。

    【例7-7】求各科平局分和总成绩平均分。

    #include int main(void){ int i,j,s=0, average,v[3]; int a[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}}; for(i=0;i<3;i++){ for(j=0;j<5;j++) s=s+a[j][i]; v[i]=s/5; s=0; } average=(v[0]+v[1]+v[2])/3; printf("math:%d

    c languag:%d

    dFoxpro:%d

    ",v[0],v[1],v[2]); printf("total:%d

    ", average); return 0;}

    对于二维数组初始化赋值还有以下说明:

    1) 可以只对部分元素赋初值,未赋初值的元素自动取0值。例如:

    int a[3][3]={{1},{2},{3}};

    是对每一行的第一列元素赋值,未赋值的元素取0值。 赋值后各元素的值为:

    1 0 0

    2 0 0

    3 0 0

    int a [3][3]={{0,1},{0,0,2},{3}};

    赋值后的元素值为:

    0 1 0

    0 0 2

    3 0 0

    2) 如对全部元素赋初值,则第一维的长度可以不给出。例如:

    int a[3][3]={1,2,3,4,5,6,7,8,9};

    可以写为:

    int a[][3]={1,2,3,4,5,6,7,8,9};

    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]。必须强调的是,a[0],a[1],a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。

    【C语言二维数组的定义和引用】相关文章:

    展开全文
  • C语言二维数组及指针引用

    千次阅读 2022-04-11 15:40:58
    文章目录C语言二维数组及指针引用1.二维数组的定义与表示2.用指针引用二维数组元素 C语言二维数组及指针引用 1.二维数组的定义与表示 二维数组是形如: 表示一个int类型,三行四列的数组 int a[3][4]={1,2,3,4,5,6,7...

    C语言二维数组及指针引用

    1.二维数组的定义与表示

    二维数组是形如:

    表示一个int类型,三行四列的数组
    int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}
    
    表示一个char类型,两行三列的数组
    char s[2][3]={{'a','b','c'},{'d','e','f'}}
    

    二维数组a的存储形式如下表所示:

    行 / 列 行/列 /a[i][0]a[i][1]a[i][2]a[i][3]
    a[0]1234
    a[1]5678
    a[2]9101112
    a[3]13141516

    其中a[i][j]则表示第i+1行中的第j+1个数
    例如:
    a[2][3]则表示第3行第4个数:12
    a[0][1]则表示第1行第2个数:2

    注意,二维数组名s表示的是一个地址常量,同时s可以看作一个二级指针常量,即:

    ss[0]s[1]s[2]s[3]
    s[0]s[0][1]s[0][1]s[0][2]s[0][3]

    注意,数组名都是首地址常量,s可以看作是一个一维数组的首地址,这个数组中存了4个元素,分别为s[0],s[1],s[2],s[3]这四个数组名,没错这四个元素可以单独看作是四个数组的数组名。比如s[0]则记录了s[0]那一行数组的首地址。
    而以s[0]的值为首地址的数组中又存放了s[0][0],s[0][1],s[0][2],s[0][3]这4个元素。

    也就是说,s这个一维数组s[0]s[1]s[2]s[3]中存放的不是具体的元素数值,而是4个一维数组的首地址:s[0],s[1],s[2],s[3],而每一个以s[i]为首地址的数组中存放的才是具体的数值s[i][j]

    2.用指针引用二维数组元素

    我们先从一个问题的引入进行分析:
    对于字符数组s考虑下面两种指针的引用形式:
    第一种:

    char *p=(char *)s;
    

    这行代码的意义是,将二维数组s的首地址转换成字符指针的类型并赋值给字符指针p,这样一来,指针p指向的就是二维数组s的首元素地址,p+1的操作可以让p每次向后移动一个字符char元素的位置。

    第二种:

    char (*p)[3]=s;
    

    首先理解char (p)[3]的含义:这是一个指针,指向的类型是一个大小为3的一维数组。那么p的值就是数组名的地址,数组名也是地址,所以这是一个指向地址的指针,什么意思呢,意思就是这个指针p中存的是地址的地址,所以是二级指针。那么 * p的意义是取p指向的数组首地址,而 ** p的意义才是数组中第一个元素。

    两种形式指针对二维数组的引用都行得通:

    • 第一种简单笨拙,每次移动一个元素去引用对应的二维数组中的第n个元素。
    • 第二种在明白其意义后则很方便直接指向第几行第几列的元素。

    考虑完这两种指针的意义后,我们分别对上面两种情形执行下面的程序:
    第一种:

    char s[2][3]={'a','b','c','d','e','f'};
    char *p=(char*)s;
    printf("%c",*++p+2);
    

    运行结果如下:

    打印出字符:d
    

    解释:数组名s原本是一个二级地址,但是通过强制类型转换(char *)将其转换为了一个一级地址,可以理解为将原来有层次的存储空间进行了扁平化处理,平铺成了一个很长的连续的一维数组,然后通过移动p去引用,那么我们看 ++p+2的意义,++优先级最高,所以指针p向后移动一个元素指向b,其次的优先级高,*p取出了p指向的元素b,b+2的ascII码为字符d

    第二种:

    char s[2][3]={'a','b','c','d','e','f'};
    char (*p)[3]=s;
    printf("%c",*(*++p+2));
    

    运行结果如下:

    打印出字符:f
    

    解释:char (p)[3]=s;的意义上面已经详细说过了,p指向的是s为首的一维数组中的第一个数组s[0],s[0]是一个一行三列的一维数组,p存放了s[0]的地址。++p的操作让p向后移动一个单元,指向了s[1],然后执行的p操作取出来s[1]的值,s[1]的值是第二列一维数组的首地址,也就是元素d的地址,然后再对*p+2的操作让这个首地址向后移动了两个单元指向了元素f,值为f的地址。最后对其进行 * 操作取出地址对应的值,则结果是元素f

    展开全文
  • 二维数组怎样才能按列的顺序转成一维数组啊 是按列的,不是按顺序
  • 二维数组在概念上时二维的,有行和列,但在内存中所有的数组元素都时连续排列的,它们之间没有“缝隙”。以下面的二维数组 a 为...c语言中的二维数组时按行排列的,也就是先存放a[0]行,在存放a[1]行,最后存放a[2]行.

    二维数组在概念上时二维的,有行和列,但在内存中所有的数组元素都时连续排列的,它们之间没有“缝隙”。以下面的二维数组 a 为例:

    int a[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};

    从概念上理解,a的分布像一个矩阵:

    0  1  2  3
    4  5  6  7
    8  9  10  11

    但在内存中,a的分布时一维线性的,整个数组占用一块连续的内存:

    c语言中的二维数组时按行排列的,也就是先存放a[0]行,在存放a[1]行,最后存放a[2]行;每行中的4个元素也是依次存放,数组a为int类型,每个元素占用4个字节,整个数组共占用4x(3x4)=48字节。

    c语言允许把一个二维数组分解称多个一维数组来处理,对于数组a,它可以分解称三个一位数组,即a[0],a[1],a[2].每一个一维数组又包含4个元素,例如a[0]包含a[0][0],a[0][1],a[0][2],a[0][3].

    假设数组a中第0个元素的地址为1000,那么每个一维数组的首地址如下图表示:

     为了更好的理解指针和二维数组的关系,我们先来定义一个指向a的指针变量p

    int (*p)[4] =a ;

    括号中的*表明p是一个指针,它指向一个数组,数组的类型为int[4],这正是a所包含的每一个一维数组的类型。

    []的优先级高于*,()是必须要加的,如果赤裸裸地写作int *p[4],那么应该理解为int *(p[4]),p就成了一个指针数组,而不是二维数组指针。

    对指针进行加法(减法)运算时,它前进(后退)的步长与它指向的数据类型有关,p指向的数据类型是int[4],那么p+1就前进4x4=16字节,p-1就后退16个字节,这正好是数组a所包含的每个一维数组的长度,也就是说,p+1会使得指向指向二维数组的下一行,p-1会使得指针指向数组的上一行。

    数组名a在表达式中会被转换为和p等价的指针。

    下面我们就来探索以下如何使用指针p来访问二维数组中的每个元素,按照上面的定义:

    1)p指向数组a的开头,也即第0行;p+1前进一行,指向第1行。

    2)*(p+1)表示取地址上的数据,也就是整个第1行数据,注意是一行数据,是多个数据,不是第1行中的第0个元素,下面的运行结果有力地证明了这一点:

    #include<stdio.h>
    int main(){
        int a [3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
        int *(p)[4] = a;
        printf("%d\n",sizeof(*(p+1)));
        return 0;
    }
    //运行结果
    16

    3)*(p+1)+1表示第1行第1个元素的地址。

    *(p+1)单独使用时表示的时第1行数据,放在表达式中会被转换为第1行数据的首地址,也就是第1行第0个元素的地址,因为使用整行数据没有实际的含义,编译器遇到这种情况都会转换为指向该行第0个元素的指针;就像一维数组的名字,在定义时或者个sizeof, & 一起使用时才表示整个数组,出现在表达式中就会被转换为指向数组第0个元素的指针。

    4)*(*(p+1)+1)表示第1行第1个元素的只,很明显,增加了一个*表示取地址上的数据。

    根据上面的结论,可以很容易推出以下的等价关系:

    a+i = p+i

    a[i] == p[i] == *(a+i) == *(p+i)

    a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == *(*(a+i)+j) ==*(*(p+i)+j)

    使用指针遍历二维数组。

    #include<stdio.h>
    int mian(){
        int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
        int (*p)[4];
        int i,j;
        p = a;
        for(i=0;i < 3;i++){
            for(j=0; j < 4;j++) printf("%2d" ,*(*(p+i)+j));     
            printf("\n");    
        }
        return 0;
    }
    //运行结果
     0  1  2  3
     4  5  6  7
     8  9 10 11

    指针数组和二维数组的区别

    指针数组和二维数组指针有着本质的区别:指针数组时一个数组,只是每个元素保存的都是指针,以上面的p1为例,在32环境下它占用4x5=20个字节的内存,二维数组指针是一个指针,它指向一个二维数组,以上面的p2为例,它占用4个字节的内存。

    展开全文
  • 学习必备 欢迎下载 C 语言程序设计课程教案表 授课题目 课时安排 2 第四章 数组2二维数组 授课时间 教学目的和要求 1掌握二维数组的定义与使用方法 教学内容 1基本内容1二维数组的定义和使用方法 2 重点二维数组的...
  • C语言二维数组指针(指向二维数组的指针)详解

    万次阅读 多人点赞 2020-05-27 17:43:22
    如有需要,请访问C语言二维数组指针(指向二维数组的指针)详解 二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二维数组 a 为例: int a[3][4] = { ...
  • 主要介绍了C语言二维数组的处理实例,有需要的朋友可以参考一下
  • C语言二维数组怎么写好有同学在面对二维数组的时候,常常会犯浑。尤其是使用函数传参的时候,有老师讲到一维数组传参后就等价于一级指针,部分同学举一反三自学成才,想当然地认为二维数组传参后就等价于二级指针,...
  • C语言 二维数组定义和使用 - C语言零基础入门教程

    千次阅读 多人点赞 2021-08-22 15:13:10
    目录 一.二维数组简介 二.定义二维数组并初始化 1.定义二维数组 2.初始化二维数组 ...三.访问二维数组 ...而二维数组和一维数组类似,简单理解就是:二维数组由多个一维数组构成,语法如下: type arrayName
  • c语言二维数组习题

    千次阅读 2021-11-07 11:29:16
    随机产生4行3列的整型二维数组(数组元素值在1-10之间),分别求各行和各列的和 #include<stdio.h> void main(){ int array[4][3], (*pArr)[3], *p[4], i, j, sum;//感想1 srand(time(NULL)); for(i=0; i&...
  • C语言二维数组字符串的赋值

    千次阅读 2021-05-19 09:07:13
    今天用到了二维数组作为参数传递的程序,通过网上搜索,针对自己遇到的问题做个整理。1、在被调用函数的形参数组定义可以省略第一维的大小,第二维不可省略,如下:void fun(int a[5][20]); //合法void fun(int a[]...
  • #include #include#include//二维整型数组打印显示void printarr2d(int (*a)[3],int row,intcol){inti,j;for(i=0; i{for(j=0; j{printf("%d", a[i][j]);}printf("\n");}}main(){int i,j;int a[2][3]={{1,2,3},{4,5,6...
  • 这种常规形式的数组一般使用不过二维,并且数组名很特殊,有跟指针以及地址有密不可分的关系,但是不一样,并且它使用数据的静态存储区。... //二维数组下标int sum = 0; //当前科目的总成绩int av...
  • 首先,定义一个二维数组int Array[y][x];一、对于二维数组的指针偏移的运算法则。同一维数组一样,二维数组的数组名也是指向第一个数组元素的(即Array等于&Array[0][0]),且二维数组的数组元素在计算机内的内存...
  • c语言二维数组如何初始化为0

    千次阅读 2021-05-20 14:22:22
    c语言二维数组如何初始化1 有两种方法(1)在定义时可以直接赋值来初始化(2)在定义后可以为其元素一个个来赋值2 示例1234567891011121314151617181920212223242526272829#include《stdio.h》void display(int arr[2]...
  • C语言 二维数组的行列区别

    千次阅读 2021-05-22 13:04:07
    printf("数组a一共有12个元素,包括3行4列,每行4个元素,每列3个元素\n"); printf("a=%d,*a=%d\n",a,*a);//&,& printf("a size=%d,*a size=%d\n",sizeof(a),sizeof(*a));//48,16 printf("a包含的元素个数是:%d,*a...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 81,184
精华内容 32,473
关键字:

c语言二维数组作用