精华内容
下载资源
问答
  • #include <stdio.h> int main() { int a[][2]={{0}}; int b[][2]={}; int i , j ; int x , y ; i = 0; j = 0;...甚是不解呀,是二维数组初始化错误了吗?请大神帮忙一下 感谢~~~
  • 二维数组定义如下:数据类型二维数组名[第一维数组长度][第二维数组长度];inta[2][3];定义了一个int型的二维数组,2行3列,共有2*3=6个元素,数组名为a。元素排列如下所示:a[0][0],a[0][1],a[0][2]a[1][0],a[1][1.....
    在前一篇文章中已经写了一维数组的定义和使用,今天写二维数组和字符数组,它们的定义和一维数组的定义是一样的。二维数组定义如下:数据类型         二维数组名 [第一维数组长度][第二维数组长度];
    int a[2][3];
    定义了一个int型的二维数组,2行3列,共有2*3=6个元素,数组名为a。元素排列如下所示:
    a[0][0],a[0][1],a[0][2]a[1][0],a[1][1],a[1][2]
    二维数组在内存中的存储方式按行排列的,a[0]行,a[1]行,a[2]行;每一行的三个元素也是依次排列的。二维数组赋值有两种方式
    a[2][3] = {{2,5,8},{9,3,0}};b[][]   = {{2,5,8},{9,3,0}};//a[2][3] = b[][];c[2][3] = {{2,5},{9,3,0}};//也可以部分赋值,没有赋值的部分系统会自动用0补齐
    上面这种赋值方式是分行赋值,{2,5,8}表示a[0]行。如果用户没有声明二维数组是几行几列,那么赋值的时候就应该加{},将每一行的元素括起来。
    a[2][3] = {2,5,8,9,3,0};
    第二种赋值方式是将元素依次赋值给数组,数组会根据用户[][]中的声明,自动将数组转换为2行3列;如果没有声明行列的值,就不能使用此种赋值方式,因为编译器不知道你想要什么样的二维数组。二维数组的使用。题目:一个3*4的矩阵,要求输出其中最大值的元素的值,以及它的行号和列号。实现步骤:首先用for循环将二维数组中的每一个元素读出来,然后元素间进行比较,将大的给a[maxr][maxc];最后在for结束时打印a[maxr][maxc];的数值,并将maxr 和maxc的数值打印出来。
    #include int main(){        int a[3][4] = {1,5,2,0,4,6,9,2,8,10,23,50};        int i,j,maxr,maxc;        maxr = maxc = 0;        for(i=0; i<3; i++)        {                for(j=0; j<4; j++)                {                        if(a[maxr][maxc] < a[i][j])                                maxr = i;                                maxc = j;                }        }        printf("max = %d  maxr = %d  maxc = %d\n",a[maxr][maxc],maxr,maxc);}

    dcaf698945f516bd060fe3e084909b71.png

    这个程序中i代表二维数组的行,j代表二维数组的列;因为内存数组是一维的,所以按照行序优先,因此第一个for循环先读取行,然后进入第二个for循环读取这一行的每一列,当这一列的元素都读完之后,返回到第一个for循环读取新的一列,一次循环,直到这个二维数组的最后一个元素。比如程序执行时,第一次进入外层for循环的时候读取a[0]行,然后进入里面的for循环,读取a[0]的每一列,a[0][0],a[0][1],a[0][2],a[0][3],然后返回到外层的for循环,读取下一行a[1],接着读取每一列,依次类推。字符数组:用来存放字符型数组的数组称为字符数组。它的定义和一维数组一样,区别在于赋值时需要用引号将元素引起来。
    char s[5] = {'c','b','r','p','o','l'};char t[] = {'c','b','r','p','o','l'};//这两种赋值方式都可以char r[] = {"hello world"};char d[] = "c.168.12.f";
    上面这四种赋值方式都是正确的,字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义之后,就只能一个字符一个字符地赋值了。请看下面的例子:
    char str[5];str = "hi";//错误,正确方式如下str[0] = 'h';str[1] = 'i';

        在C语言中没有字符串(string)类型,所以如果要定义一个字符串,只能通过字符数组完成。因为字符串是连续的,所以在内存中如果要找到一个字符串,除了知道从什么地方开始,还要知道从什么地方结束,所以C语言中规定‘\0’为字符串的结束标志。所以上述的赋值例子中下char r[]和char d[]是字符串,因为使用双引号给字符数组赋值时,在存储空间足够时,结尾会默认加‘\0’,因此如果想定义字符串时,一定记得给‘\0’留一个位置。

    char r[] = {"hello world"};char d[] = "c.168.12.f";char h[4] = "fine";//错误,因为fine本身已经有4个字符了,\0就没有位置了char a[5] = "fine";//正确

    但是单引号逐个赋值时并不会默认加‘\0’,所以需要在赋值时加上。

    char h[5] = {'f','i','n','e','\0'};//这样才是一个字符串,而不是单个字符char s[]  = {'a','b','1','2','\0'};

    字符串长度:strlen(计算这个数组有多少个元素)

    在使用字符串长度这个函数的时候,它不会统计\0,所以上面这个例子中s[]这个数组的字符串长度是4。字符数组的使用:输入一个字符串,逆序输出。
    #include #include int main(){        int i,j,n;        char str[30] = {0};//为了避免初始化时,实际元素个数少于声明的空间大小                          //而输出乱码的问题,在声明时直接全部初始化为0        printf("请输入一个字符串:");        gets(str);        n = strlen(str);        for(i=n-1; i>=0; i--)        {                putchar(str[i]);        }        putchar('\n');        return 0;}       

    0fded3fc53b231c6d012dfc980045217.png

    输入字符串之后,通过strlen得到字符串的长度,然后利用for循环完成逆序。逆序过程就是将最后一个字符和第一个字符交换,倒数第二个和正数第二个交换。上面这个程序中字符串长度为5,但是数组下标是从0开始,所以需要用字符串长度减去一,得到最后一个字符的下标,这个程序中是a[4],然后将它打印出来,依次类推,下一个打印a[3],直到将所有字符都打印出来,即i=0时,退出循环。
    展开全文
  • C语言二维数组赋值方式

    千次阅读 2020-03-26 19:25:06
    1 #include<stdio.h> 2 int main(){ 3 /* char chh[]={'a','a','a','a','a','\0'}; 4 printf("%s",chh);*/ 5 //二维数组 6 //在定义时赋值 7 int n...

    1   #include<stdio.h>
      2 int main(){
      3         /*      char chh[]={'a','a','a','a','a','\0'};
      4                 printf("%s",chh);*/
      5         //二维数组
      6         //在定义时赋值
      7         int n[3][3]={{1,2,3},{4,5,6},{7,8,9}};
      8         //循环嵌套赋值
      9         for(int i=0;i<3;i++){
     10                 for(int j=0;j<3;j++){
     11                         scanf("%d",&n[i][j]);
     12                 }
     13         }
     14         return 0;
     15 }
     16
    ~       

    展开全文
  • 小明在学到二维数组时,尝试写了一段给二维数组赋值的代码,他发现一个奇怪的现象:交换赋值顺序,效率是不同的。交换赋值顺序,效率是不同的请看下面这两段C语言代码:版本 1int test1 (){ int i,j; static int x...

    学习C语言最有效的方法就是多做实验,很多初学者深知这一点。小明在学到二维数组时,尝试写了一段给二维数组赋值的代码,他发现一个奇怪的现象:交换赋值顺序,效率是不同的。

    dd471260133d0cd4359582685f1047f1.png

    交换赋值顺序,效率是不同的

    请看下面这两段C语言代码:

    版本 1

    int test1 (){ int i,j; static int x[4000][4000]; for (i = 0; i < 4000; i++) { for (j = 0; j < 4000; j++) { x[j][i] = i + j; } } return 0;}

    版本 2

    int test2 (){ int i,j; static int x[4000][4000]; for (j = 0; j < 4000; j++) { for (i = 0; i < 4000; i++) { x[j][i] = i + j; } } return 0;}
    aa9315d03d03f37825042f9e0f23e26d.png

    唯一的不同点在于交换了 i 和 j 变量

    这两个版本的C语言代码几乎完全相同,唯一的不同点在于交换了 i 和 j 变量,但是编译成C语言程序执行后,消耗的时间却是不同的,这是怎么回事呢?

    解析

    可能有读者认为这两段C语言代码产生效率上的差异,是因为编译器处理这两段代码时,产生的指令不同。其实不是的,这两段“对称”的C语言代码产生的指令是一致的,请看:

    15d222385d2a107b3602a01314f7cf15.png

    test1() 函数对应的汇编代码

    上图是 test1() 函数对应的汇编代码,下图是 test2() 函数对应的汇编代码。

    d9ad9044c2a92d9e78378b4262dc54d5.png

    test2() 函数对应的汇编代码

    仔细对比 test1() 和 test2() 对应的指令,我们很难发现二者有什么不同。事实上,二者运行的效率差异主要来自于“缓存命中率”。简单来说,就是连续操作C语言中的多维数组的最后一个维度最快,因此 test1() 中的赋值操作几乎每次都会错过缓存,而 test2() 中的赋值操作缓存命中率更高一些,因此 test2() 执行所消耗的时间更少。

    在很多C语言初学者的脑海里,二维数组各个元素在内存中的分布可能是下面这样的:

    4fa5539e8a589a642585d35d65417d10.png

    二维数组各个元素在内存中的分布

    但是计算机中的内存地址始终是一维的,因此在计算机眼中,二维数组仍然是按照一维排列的:

    bc9de2ef2d09ee7585a28a923ac8533f.png

    二维数组仍然是按照一维排列的

    test2() 中的赋值操作先遍历第二维,这一过程是下图这样的:

    24b388c9812d71ae0f815236f9c4d552.png

    这一过程是下图这样的

    此时C语言程序每次访问数组元素,在内存中都是顺序进行的,这对于缓存命中率的提升很有帮助。再来看 test1() 中的赋值操作,它优先遍历第一维,因此访问数组元素的过程是下图这样的:

    56e7c404004774068146b30adffaa572.png

    访问数组元素的过程是下图这样的

    显然,此时C语言程序访问数组元素在内存中是“跳跃式”的,但是,计算机访问内存各个地址的效率不是都一样的吗?那为什么 test1() 和 test2() 的效率不同呢?

    答案就是 test1() 和 test2() 的缓存命中率不同。计算机 CPU 一般都有更加高速的缓存(称为“缓存线(cache line)”,常是 64 字节),访问这一缓存的速度比访问内存的速度要高的多(读者可以对比想象计算机访问内存的速度比访问硬盘数据的速度快得多)。

    小明的C语言代码中赋值的元素是 int 型的(常常是 4 字节),因此 64 字节的缓存线可以容纳 16 个连续的整数,CPU 访问这 16 个数据要比访问内存里的 16 个数据快得多,并且 CPU 在加载缓存线数据的时间内,能处理相当多的工作。

    5e851c1a8e992dd7b9502ccc349bd1a3.png

    CPU 在加载缓存线数据的时间内,能处理相当多的工作

    CPU 在处理 test2() 中的赋值时,可以获取 16 个连续的整数块,然后赋值给数组,重复 4000*4000/16次,这样的操作在缓存线的支持下相当快,因为 CPU 没有被闲置,总是在处理事务。

    再考虑 test1() 中的赋值,缓存线加载了 16 个整数块,但是接着值修改了其中一个整数,因此它需要重复 4000*4000 次,相比于 test2() 中的赋值,需要 16 倍的内存“回迁”次数。而 CPU 实际上需要花时间坐着干等内存操作完成,因此 test1() 的效率要低一些。

    小结

    本节主要讨论了一个看似“灵异”的C语言二维数组赋值问题,这无关指令差异,更多的是缓存命中差异带来的效率差异。但是读者应该明白,并不是所有的计算机程序都如此,例如 Fortran 语言中,test1() 中的赋值效率要高于 test2() 中的赋值效率,因为它将二维数组在内存中展开时,是按照“列”优先排列的(C语言是按“行”优先排列的)。

    ac624cff92275c94305528dedef7b83a.png

    点个赞再走吧

    欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

    未经许可,禁止转载。

    展开全文
  • 一、数组的定义数组:由若干类型相同的相关数据项按顺序存储在一起形成的一组同类型有序数组的集合元素:用一个统一的名字标识这组数据,这个名字称为数据名,构成数据...下标的个数表示数组数,下标值表示相应...
    72b8c8ea8adf78fb2542208f4ecfbd8d.png

    一、数组的定义

    数组:由若干类型相同的相关数据项按顺序存储在一起形成的一组同类型有序数组的集合

    元素:用一个统一的名字标识这组数据,这个名字称为数据名,构成数据的每一个数据项

    下标:从0开始的整数,遵循“先定义,后使用”的规则

    数组定义的一般形式:

    类型数组名[下标1][下标2]...[下标n];

    注意:

    类型用于声明数组的类型,即数组中元素的类型;

    数组名用于标识该数组;

    下标的个数表示数组的维数,下标值表示相应维的长度;

    下标的个数为1表示一维数组,下标的个数为2时表示二维数组,依此类推,下标的个数为n时表示n维数组。

    例子1:若要定义一个100个整型元素的一维数组,形式如下:

    int score[100];

    不能写成这样子:int score[n];//注意:无论在数组定义前变量是否已被赋值,都是非法的

    小贴士:

    1.定义数组的长度必须使用整型常量或整型常量表达式。ANSI C89不允许使用变量定义可变长度的数组

    2.C语言中数组的下标都是从0开始的,对于任何一个数组,它的第一个元素都是第0号元素,最后一个元素的下标为99(不是下表为100)

    例子2:定义一个具有3行4列共12个元素的整型二维数组,即

    int matrix[3][4];

    注意:第一个元素为matrix[0][0];最后一个元素为matirx[2][3];

    小贴士:

    C语言的数组在内存中是按行存放的,从第一行开始存放,存完后存第二行,接着就依次类推,直到最后一行。

    注意:matirx[0][4]和matirx[11[0]指的是同一个元素,matirx[0][4]虽然写法合法,但是已越界到下一行,因为C编译器不检查下标越界,所以这样使用存在严重的隐患。

    二、数组的引用

    数组的引用方式如下:

    数组名[下标1][下标2]...[下标n];

    与数组定义时不同,引用数组时的下标既可以是整型常量或整型表达式,也可以含有已赋值变量的整型表达式。

    注意:每一维的下标一定是单独用方括号括起来。

    下面的程序段实现从键盘输入数组元素的值:

    一维数组:

    for(i=0;i<6;i++)

    {

    scanf("%d

    展开全文
  • 今天使用某个函数,其中的参数是类型为char**, 使用了一个固定的二维数组,将其赋值给予,编译时产生警告;在运行的调用的函数(其中没有任何对字符串内容的修改),打印其中的字符串,直接崩溃。 警告内容:...
  • 上节讲解的数组可以看作是一行连续的数据,只有...本节只介绍二维数组的定义二维数组定义的一般形式是:dataType arrayName[length1][length2];其中,dataType 为数据类型,arrayName 为数组名,length1 为第一维下...
  • 数组是一种数据格式,能够存储多个同类型的值,一位数组可以用来实现线性表的顺序存储,哈希表等,二维数组可以用来保存图的邻接矩阵等。一维数组的声明一维数组声明应指出以下三点:存储在每个元素的值的类型,如,...
  • C语言二维数组

    2018-04-14 17:31:50
    a[3][4]很多人的第一印象是这样的: 这样并没有错,但是只能作为一个印象图来理解而我们要知道二维数组其实是一个一维数组,只不过一维数组的每个元素又是一个一维数组,就像下面这样:初始化对二维数组赋值:for...
  • 昨天晚上,我正在给之前获奖的同学发奖品,正在进行中的时候,看到黄兄推送了一篇文章,里面讲到数组越界会导致无限循环。关于抽奖看这篇文章《Linux进程管理数据结构》,以后也会不定期抽奖,今年多赚点钱,过年的...
  • 数组[X] 一维数组[X] 二维数组部分MD效果无法显示- -C语言学习笔记(数组) - Muxxs学习世界​note.muxxs.com一维数组定义一维数组类型说明符 数组名[常量表达式]注意此处必须为常量,不可 为变量Example:int a[10];...
  • 01一维数组的定义1、一般形式类型符 数组名[常量表达式]2、数组名的命名规则和变量名相同,遵循...02一维数组的引用1、引用形式数组名[下标]2、在定义数组并对其中各元素赋值后,就可以引用数组中的元素。3、应...
  • 一、建立二维数组赋值 程序1: #include <stdio.h> int main() { int a[6][6],i,j; //定义一个六行六列的二维数组 for(i=1;i<6;i++) for(j=1;j<6;j++) a[i][j] = (i/j)*(j/i); //对除第一行...
  • 这种常规形式的数组一般使用不过二维,并且数组名很特殊,有跟指针以及地址有密不可分的关系,但是不一样,并且它使用数据的静态存储区。要使用大容量的动态内存,需要单独开辟,这里不做介绍,... //二维数组下标 ...
  • C语言二维数组字符串的赋值

    千次阅读 2014-12-24 17:02:48
    今天用到了二维数组作为参数传递的程序,通过网上搜索,针对自己遇到的问题做个整理。1、在被调用函数的形参数组定义可以省略第一维的大小,第二维不可省略,如下:void fun(int a[5][20]); //合法void fun(int a[]...
  • c语言二维数组应用冒泡排序问题`````int a[2][4]; 分别给他赋值;例如`1 2 3 4 60 70 90 80 假设a[0][0]到a[0][3]为学号`a[1][0]到a[1][3]为分数`
  • 一、二维数组的定义 二维数组定义的一般形式是: dataType arrayName[length1][length2]; 其中,dataType 为数据类型,arrayName 为数组名,length1 为第一维下标的长度,length2 为第二维下标的长度。 我们可以...
  • c语言二维数组

    2021-02-12 12:14:02
    //赋值打印方式 //1. int arr[2][3]; arr[0][0] = 1; arr[0][1] = 2; arr[0][2] = 3; arr[1][0] = 4; arr[1][1] = 5; arr[1][2] = 6; //2. int arr1[2][3] = { {1,2,3}, {4,5,6},/
  • //定义一个二维数组 int arr[ROWS][CLOS]; 数组可以以以下方式进行遍历: //数组赋值...略 int newline = 1; for (int* p = &arr[0][0]; p < &arr[ROWS-1][CLOS]; p++) { printf("%d ", *p); if ...
  • C语言编程中,二维数组的定义、取值以及赋值都比较容易,与一维数组类似。然而,在将二维数组作为函数参数传递时,参数结构较复杂,难以理解。本文章是实用型文章,注重代码使用,不会讲述过多理论。如果想要学习...
  • 二维数组: ...和一维数组不同的是 二维数组有两个中括号 赋值也不同 其中的第一个括号表示的是: 这个二维数组有多少个一维数组构成 第二个括号表示构成这个二维数组的每个一维数组有多少元素
  • C语言二维数组形参问题

    千次阅读 2019-09-15 11:30:51
    首先,二维数组形参的列大小必须指定;(否则编译会报错) 其次,列值大小,决定了调用函数时,实参对形参的赋值方式;(如果在函数调用时,列值大小不匹配,很可能因为错误的地址访问,造成内存崩溃) void ...
  • 二维数组的4种数组初始化: 一、直接分行给二维数组赋初值 例:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; //推荐使用此方便赋值数组 二、将所有数据写一个花括号内 例:int a[3][4]={1,2,3,4,5,6,7,8,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 527
精华内容 210
关键字:

c语言二维数组赋值

c语言 订阅