深入了解C语言数组

目录

何为数组

一维数组的创建和初始化

一维数组的使用

strlen

一维数组在内存中的存储

二维数组的创建和初始化

二维数组的使用

二维数组在内存中的存储

数组作为函数参数 

数组应用练习题


何为数组

数组
可以一次性存储多个相同类型的数据。当要使用多个相同类型,相似含义,相同生存空间的数据时,可以存放在数组中。
数组元素通过下标来访问,需要注意的是数组元素的下标从0开始

一维数组的创建和初始化

数组的创建
type_t arr_name[const_n];
//type_t 数组的元素类型       
//arr_name 数组名称
//const_n 一个常量表达式,用来指定数组大小
数组的初始化
类比一般整形元素的初始化可大致想到数组元素的初始化是否与之类似
下边给出数组初始化代码展示
整形元素初始化
int a = 0; //整形元素的初始化
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; //完全初始化
int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //可以省略元素个数,根据初始化的内容进行初始化确定数组中元素个数
int arr[10] = { 1,2,3,4,5 }; //不完全初始化
ps:看到这里很难不让人产生一种疑问 不完全初始化时各个元素的值都是多少呢?要想知道这个值是多少怎么办呢,很简单打印出来这个数组的每个元素不就知道它们的值了嘛,数组元素的打印要用到for循环来实现
下面请看代码
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5};//不完全初始化
int i;
for (i = 0; i < 10; i++)
{
   printf("%d ", arr[i]);
}
return 0;
}

运行结果如下:

 

可知未被赋值的元素都被初始化为0
字符型元素初始化
初始化字符数组常用的就是以下两种方式 
char arr[5] = { 'h','e','l','l','o' };//一个字符一个字符的初始化
char arr[6] = "hello";//以字符串形式初始化每个字符元素

细心的小伙伴可能会发现明明hello只有五个字符元素,第二种方法初始化的时候却给了6个元素的存储空间,为什么不用5呢,这就要说到另一个知识点了, 就是字符串的结束标志是\0,这也是一个元素也需要存储,否则的话会产生如下报错:

一维数组的使用

首先要知道[ ]操作符,strlen函数,sizeof操作符
[ ]下标引用操作符,用来访问数组中元素的操作符
strlen函数用来求字符串长度的函数 
<cstring>

strlen

size_t strlen ( const char * str );
而sizeof是用于判断变量或数据类型的大小
下面分别用sizeof,strlen得到数组的大小并依次输出数组元素
#include <stdio.h>
#include <string.h>
int main()
{
       char arr[] ="hello";
       int len = strlen(arr);
       int i = 0;
       for (i = 0; i < len; i++)
       {
              printf("%c ", arr[i]);
       }
       
       return 0;
}

运行结果

 

#include <stdio.h>
int main()
{
       char arr[] ="hello";
       int len = sizeof(arr) / sizeof(arr[0]);
       int i = 0;
       for (i = 0; i < len - 1; i++)
       {
              printf("%c ", arr[i]);
       }
       
       return 0;
}

运行结果
总结:
1.数组是通过下标来访问的,下标是从0开始的
2.数组的大小可以通过计算得到(常用len=sizeof(arr)/sizeof(arr[0])

一维数组在内存中的存储

由上图的运行结果可以看到数组元素在内存中的存储是由高到低连续存放的

二维数组的创建和初始化

二维数组的创建
        int arr[3][4];
        //存储三行四列12个数组元素
        char arr[3][5];
        double arr[2][4];
二维数组的初始化
        int arr1[3][4] = { 1,2,3,4 };
        //未初始化的元素默认被初始化为0
        int arr2[3][4] = { {1,2},{3,4} };
        //一行一行的初始化也是可以的
        int arr3[][4] = { 1,2,3,4,5,6,7,8,9 };
        //二维数组初始化时,行可以省略,列不能省
由上图运行结果可以得出为别初始化的数组元素,默认初始化为0

二维数组的使用

二维数组的使用也是通过下标的方式
看代码
二维数组在内

二维数组在内存中的存储

像一维数组那样,这里也试着打印二维数组中每个元素的地址
如上图所示代码,可以看出二维数组元素在内存中的存储仍然是依次连续存放的

数组作为函数参数 

这里以冒泡排序函数进行举例
#include <stdio.h>
void Bubble_sort(int* arr,int sz)
{
       int i, t, j = 0;
       for (i = 0; i < sz - 1; i++)
       {
              for (j = 0; j < sz-i-1; j++)
              {
                      if (arr[j] > arr[j + 1])
                      {
                             t = arr[j];
                             arr[j] = arr[j + 1];
                             arr[j + 1] = t;
                      }
              }
       }
}
int main()
{
       int arr[] = { 1,43,25,74,34,22,48,3,5,4 };
       //用冒泡排序函数对数组arr进行升序排列
       int sz = sizeof(arr) / sizeof(arr[0]);
       int i = 0;
       Bubble_sort(arr, sz);
       for (i = 0; i < 10; i++)
       {
              printf("%d ", arr[i]);
       }
       return 0;
}

运行结果为:

数组应用练习题

例1:
从键盘上输入16个整数,保存在4*4的二维数组中,输出数组偶数行和偶数列中所有元素。
#include <stdio.h>
int main()
{
       //从键盘上输入16个整数,保存在4 * 4的二维数组中,输出数组偶数行和偶数列中所有元素。
       int arr[4][4] = { 0 };
       int i, j = 0;
       for (i = 0; i < 4; i++)
       {
              for (j = 0; j < 4; j++)
              {
                      scanf("%d", &arr[i][j]);
              }
              printf("\n");
       }
       for (i = 0; i < 4; i++)
       {
              for (j = 0; j < 4; j++)
              {
                      if (i % 2 == 0)
                      {
                             printf("%4d", arr[i][j]);
                      }
                      else if (j % 2 == 0)
                      {
                             printf("%4d", arr[i][j]);
                      }
                      else
                      {
                             printf("%4c",' ');
                      }
              }
              printf("\n");
       }
       
       return 0;
}

结果如下:
例2:
输出5*4矩阵的转置4*5矩阵
#include <stdio.h>
int main()
{
       //输出5*4矩阵的转置4*5矩阵
       int i, j = 0;
       int arr1[5][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16},{17,18,19,20} };
       int arr2[4][5] = { 0 };
       for (i = 0; i < 5; i++)                //将数组arr1转置
       {
              for (j = 0; j < 4; j++)
              {
                      arr2[j][i] = arr1[i][j];
              }
       }
       for (i = 0; i < 4; i++)                //输出转置后的数组arr2
       {
              for (j = 0; j < 5; j++)
              {
                      printf("%4d", arr2[i][j]);
              }
              printf("\n");
       }
       
       return 0;
}

运行结果:
例3:
从键盘输入若干学生(不超过100人)的成绩,计算平均成绩,并输出高于平均分的人数及成绩。输入成绩为负时结束。
#include <stdio.h>
int main()
{
       //从键盘输入若干学生(不超过100人)的成绩,计算平均成绩,并输出高于平均分的人数及成绩。输入成绩为负时结束。
       double arr[100] = { 0 };
       int i, count=0, n= 0;
       double average = 0.0, score = 0.0,sum=0;
       scanf("%lf", &score);
       while (score >= 0 && count < 100)
       {
              arr[count] = score;
              sum += score;
              count++;
              scanf("%lf", &score);
       }
       average = sum*(1.0) / count;
       printf("The average is:%lf\n", average);
       n = 0;
       for (i = 0; i < count; i++)
       {
              if (arr[i] > average)
              {
                      printf("%lf ", arr[i]);
                      n++;
                      if (n % 5 == 0)
                      {
                             printf("\n");
                      }
              }
       }
       printf("\n");
       printf("Number of digits larger than the average:%d\n", n);
       return 0;
}

运行结果为:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值