爬爬爬之路:C语言(五) 二维数组篇

二维数组 的声明, 第一个中括号代表行数, 第二个中括号代表列数
建议声明格式如下:
    int array[ 3 ][ 4 ] = {
        {
1 , 6 , 112 , 15 },
        {
12 , 17 , 18 , 22 },
        {
14 , 11 , 16 , 12 }
    };

二维数组的遍历:
    int array[ 4 ][ 5 ] = { 0 };  // 初始化为0, 即array数组中共 4 * 5 = 20 个元素的初始值均为0
    for ( int i = 0 ; i < 4 ; i++) {  // 外层循环控制遍历数组的行数
       
for ( int j = 0 ; j < 5 ; j++) {  // 内层循环控制遍历数组的列数
            array[i][j] =
arc4random () % ( 100 - 20 + 1 ) + 20 ; // 给每个元素赋值
        }
    }
   
for ( int i = 0 ; i < 4 ; i++) { // 遍历打印二维数组
       
for ( int j = 0 ; j < 5 ; j++) {
           
printf ( "%d " , array[i][j]);
        }
       
printf ( "\n );  // 行与行之间换行
    }

二维数组的赋值:
    方法一: 同上代码  可直接在程序内给数组赋值
    方法二: 通过控制台给数组赋值 代码如下:
   inta[3][10] = {0};
   
for (inti =0; i <10; i++) {
       
for (intj =0; j <10; j++) {
           
scanf("%d", &a[i][j]);
        }
    }
   
for (inti =0; i <10; i++) {
       
for (intj =0; j <10; j++) {
           
scanf("%d", a[i]+ j);
        }
    }
     二维数组的本质是一个特殊的一维空间, 特殊在于 这个一维数组保存的元素类型是数组 且每个元素的长度必须是相同的
     如定义一个二维数组 a[10][10]
     相当于:
     a[10] = {b[10],b[10]b[10]}; {}内共十个元素
    
     因为二维数组是也是一段连续的空间
     假设 定义二维数组 a[row][col]   // 这里的row 和col 得由程序员先行确定 并且得是一个常量
     系统会根据给定的 常量 row 和col 在内存中开辟一个大小为 row * col的连续空间
     空间的地址是连续的 地址按顺序排列为:
   &a[0][0],&a[0][1]… &a[0][col - 1], &a[1][0], &a[1][1]…&a[1][col-1],&a[2][0]…&a[row - 1][col - 1]
          
          和一维数组相同 二维数组也可通过数组名访问二维数组的地址 相同于一维数组直接使用数祖名访问首元素地址
          二维数组是通过二维数组名访问其首地址  二维数组名正是其一维数组. 各位看官可能不理解 不急往下看:
          如 要访问二维数组第0行第0列 元素的地址
          可用&a[0][0] 来访问  简单粗暴  而什么叫二维数组的数组名就是其一维数组呢
          即 二维数组a[row][col] , 其第 i 行二维数组的名字 就是 a[i]
          也就是 a[i] = &a[i][0] 
          而第 j 行二维数组的名字就是 a[j]
          结合一维数组的访问地址规律
          根据上文给的地址顺序可推倒出
          a[i] + j 即使 a[i][j] 的地址
          即  a[i] + j = &a[i][j] 根据此规则  可将上文的地址顺序等价改写成
         a[0] + 0, a[0] + 1,…,a[0]+col * 1 - 1, a[0] + col * 1…,a[0] + col * 2 - 1, a[0] + col*2 ,…, a[0] + row*col - 1
          对比两个顺序 可以发现
          a[0] + col = &a[1][0]
          又根据规则 a[i] = &a[i][0]
          a[0] + col = &a[1][0] = a[1]
          

          如果能看懂以上各种描述混乱的规则说明你本身已经开始掌握了二维数组的排列顺序
          如果看不懂 没关系 记住结论
          可通过  a[i] 访问 第i行 首元素的地址  即等价于  &a[i][0]
     本段乱七八糟的长篇大论 请结合以上二维数组赋值的代码来看  如果实在看不懂请联系我  我再想办法!
     

如何将x行y列的二维数组的值, 保存到另一个y行x列的数组里
    int array[ 3 ][ 6 ] = { 0 };
   
int array2[ 6 ][ 3 ] = { 0 };
   
for ( int i = 0 ; i < 3 ; i++) {
        for (int j = 0; j <6; j++) {
            array[i][j] =arc4random() % (50-10+1) +10;// 给第一个数组遍历, 赋值
            array2[j][i] = array[i][j];// 将第一个数组的元素复制到第二个元素列行对应的地方
        }
    }
   
printf ( " 数组 1:\n" );
   
for ( int i = 0 ; i < 3 ; i++) {  // 打印第一个数组
       
for ( int j = 0 ; j < 6 ; j++) {
           
printf ( "%d " ,array[i][j]);
        }
       
printf ( "\n" );
    }
   
printf ( " 数组 2:\n" );
   
for ( int i = 0 ; i < 6 ; i++) {  // 打印第二个数组
       
for ( int j = 0 ; j < 3 ; j++) {
           
printf ( "%d " , array2[i][j]);
        }
       
printf ( "\n" );
    }

二维数组应用: 
     电影购票软件选座购票界面
     泡泡糖 坦克大战的  界面

二维数组的初始化

     定义二维数组时候 可以不给第一维的个数
     但是必须给第二维的数字 否则报错
     1. 初值不够一行的时, 系统自动用0补齐一行.
     2. 初值刚刚够一行的时候, 不会补值
     3. 初值超过1行不足2行时, 自动用0补齐, 以此类推
    int a[][ 4 ] = { 1 , 2 , 3 , 4 , 5 };
   
for ( int i = 0 ; i < 3 ; i ++) {
       
for ( int j = 0 ; j < 4 ; j++) {
           
printf ( "%d " , a[i][j]);
        }
       
printf ( "\n" );
    }
   输出结果为
          1 2 3 4
          5 0 0 0
          1606416312 32767 1252157651 2063661990 
    
   输出结果的行数 由遍历的外层循环次数控制 
   列数由第二维的大小控制



字符串数组:
     输出字符串数组的方法:
   charstr3[3][20] = {"abc","123456","hello world"};
    for (int i = 0 ; i <3; i++) {//用一维数组的下标可取出对应字符串
       printf("%s\n", str3[i]);
    }
   //取出字符串数组中单个字符
    printf("%c", str3[1][2]);
    
     不同于普通的二维数组, 字符串数组输出字符串不需要两层循环遍历   因为以%s 格式输出字符的时候,系统自动已经遍历了一遍
     因而要取出某个具体字符时扔需要像普通二维数组一样通过两个下标获得值

     需要更改字符串数组中的字符串方法: 
   //赋值字符串
   
char str4[] ="qwer";
    strcpy(str3[0], str4);
    printf("%s\n", str3[0]);  //字符串在进行赋值的时候 需要使用字符串拷贝




字符数组的冒泡排序:
    char name[ 4 ][ 20 ] = { "lyz" “qaqa" “bpeqd" , "lydqqq" };
   for(inti =0; i <4- 1; i++) {
       
for (intj =0; j <4-1- i; j++) {
           
int change = strcmp(name[j], name[j +1]);
           
if (change >0) {
               
char temp[20];
               
strcpy(temp, name[j]);
               
strcpy(name[j], name[j +1]);
               
strcpy(name[j +1], temp);
            }
        }
    }
   
for (inti =0; i <4; i++) {
       
printf("%s\n", name[i]);
    }




三维数组:
    int array[ 2 ][ 3 ][ 4 ] = {
        {
            {
1 , 4 , 5 , 7 },
            {
2 , 4 , 8 , 9 },
            {
3 , 5 , 11 , 22 }
        },
        {   {
12 , 15 , 16 , 11 },
            {
13 , 16 , 11 , 22 },
            {
22 , 24 , 21 , 21 }
        },
    };
元素个数为: 2 * 3 * 4 = 24

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值