数组(一维数组、二维数组、变长数组)

打印 上一主题 下一主题

主题 1018|帖子 1018|积分 3054

1.数组的概念

•数组是⼀组相同范例元素的聚集
• 数组中存放的是1个大概多个数据,但是数组元素个数不能为0。
• 数组中存放的多个数据,范例是相同的
•数组分为⼀维数组和多维数组
2.一维数组的创建和初始化

(1)数组创建

语法:
  1. 1 type name[常量值]
复制代码
• type 指定的是数组中存放数据的范例,可以是: char short  int  float 等,也可以⾃定义的范例
• name 指的是数组名的名字, 名字可以自拟定,有意义的就行
• [] 中的常量值是⽤来指定数组的⼤⼩的,数组大小根据需求指定即可
•[]中的常量值可以不写,编译器会根据初始化所给的元素的个数确定数组的元素个数
  1. 1 int arr[] = {1,2,3};//arr数组的个数就有3个
复制代码
例子:存储班级的20⼈的结果
  1. 1 int grade[20];
复制代码
(2)数组的初始化

•创建数组时,给定⼀些初始值,这就称为初始化
•数组的初始化⼀般使⽤⼤括号,将数据放在⼤括号中
完全初始化 ( 数组有多少个元素,给定多少个初始值 )
  1. 1 int arr[5] = {1,2,3,4,5}; // 数组有5个元素,给定5个初始值
复制代码
不完全初始化 ( 没有给定数组相应元素个数的初始值 )
  1. 1 int arr1[5] = {1};//第一个元素初始化为1,剩余的元素默认为0
  2. 2 double arr2[5] = {1.1,2.4};//同理,第一个元素初始化为1。1,第二个元素初始化为2.3,剩余的元素默认为0
复制代码
错误初始化 ( 初始化项多于数组元素个数)
  1. 1 int arr[2] = {1,2,3};
复制代码
(3)数组的范例

•去掉数组名留下的就是数组的范例
例如:
  1. 1 int arr1[10]; // arr1 的数组的类型是 int [10]
  2. 2 double arr2[3]; // arr2 的数组的类型是 double [3]
  3. 3 char arr3[5]; // arr3 的数组的类型是 char [5]
复制代码
运用sizeof区别,sizeof可以计算内置的范例,数组、⾃定义范例的⼤⼩
siezof (type) type可以是数据的范例大概数值名
(详细可看https://blog.csdn.net/Siri_s12/article/details/143997006?spm=1001.2014.3001.5501)
sizeof(arr) = sizeof(int [5])这也侧面反映出去掉数组名留下的就是数组的范例这句话

3.一维数组

(1)数组下标

•C语⾔规定数组是有下标的,下标是从0开始的,假设数组有n个元素,末了⼀个元素的下标是n-1,下标就相称于数组元素的编号
例如:
  1. 1 int arr[8] = {1,2,3,4,5,6,7,8};
复制代码

•在C语⾔中数组的访问提供了⼀个操纵符[] ,这个操纵符叫:下标引⽤操纵符,如果想要访问下标为3的元素,可以表述成arr[3],arr[3] 代表的数是4

(2)数组元素的打印

•使⽤for循环
整形数组和浮点型数组没办法一次性输出,必须使用循环
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int arr[8] = { 1,2,3,4,5,6,7,8 };
  5.         for (int i = 0; i <= 8; i++)
  6.         {
  7.                 printf("%d", arr[i]);
  8.         }
  9.         return 0;
  10. }
复制代码

字符数组的输出可以使用循环,也可以一次性输出

这里用字符串形式输出

(3)数组的输入

•使⽤for循环
整形数组和浮点型数组的操纵是逐个元素去处理的,没u一次输入,也没办法一次性输出,必须使用循环
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int arr[8] = { 1,2,3,4,5,6,7,8 };
  5.         int i = 0;
  6.         //数组的输入
  7.         for ( i = 0; i < 8; i++)
  8.         {
  9.                 scanf("%d", &arr[i]);//arr[i]代表的是数组的元素,所以要取地址&,数组名才不用取地址
  10.         }
  11.         //数组的输出
  12.         for ( i = 0; i < 8; i++)
  13.         {
  14.                 printf("%d ", arr[i]);
  15.         }
  16.         return 0;
  17. }
复制代码

4.一维数组在内存中的存储

•数组在内存中是连续存放的

•x64 ---- 编译产生的是64位的程序,地址是64位的,比较长

•x86 ---- 编译产生的是32位的程序,地址是32位的,比较短

•地址是16进制打印(1-9,A-F)
A=10 B=11 C=12 D=13 E=14 F=15

运用x86的地址数据观察:
•从输出的结果我们分析,数组随着下标的增⻓,地址是由⼩到⼤厘革的,而且我们发现每两个相邻的元素之间相差4(因为⼀个整型是4个字节)。以是我们得出结论:数组在内存中是连续存放的
•从下标也可以看出,地址是由⼩到⼤厘革的

5.sizeof 计算数组元素个数

  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int arr[10] = { 0 };
  5.         printf("%zd\n", sizeof(arr));
  6.         //计算的是数组的总长度,单位是字节,10*4=40
  7.        
  8.         return 0;
  9. }
复制代码

数组中所有元素的范例都是相同的,只要计算出⼀个元素所占字节的个数,数组的元素个数就能算出来
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int arr[10] = { 0 };
  5.         printf("%zd\n", sizeof(arr));
  6.         //计算的是数组的总长度,单位是字节,10*4=40
  7.        
  8.         printf("%zd\n", sizeof(arr[0]));
  9.         //计算的是数组下标为0的元素的长度,单位是字节,4
  10.         return 0;
  11. }
复制代码

接下来就能计算出数组的元素个数:
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int arr[10] = { 0 };
  5.     printf("%zd\n",sizeof(arr)/sizeof(arr[0]));//结果是10,表示数组有10个元素
  6.         return 0;
  7. }
复制代码

在代码中需要数组元素个数的地⽅就可以不⽤固定写死,可以使用 sizeof() 计算数组的长度,不管数组怎么厘革,计算出的⼤⼩也就随着厘革了
6.二维数组

(1)二维数组的概念

•把⼀维数组做为数组的元素,就是⼆维数组
•以此类推,把二维数组作为数组的元素就是三维数组
•⼆维数组以上的数组统称为多维数组
(2)二维数组的创建

语法:
  1. 1 type name[常量值1][常量值2];
复制代码
•type 表现数组的范例
•name 表现数组的名字,不固定,取有意义的即可
•常量值1表现数组的行数
•常量值2表现每行有多少个元素
例子:
  1. 1 int arr[3][4];
  2. // int 表⽰数组的每个元素是整型类型
  3. // arr 是数组名,可以根据⾃⼰的需要指定名字
  4. // 3表⽰数组有3⾏
  5. // 5表⽰每⼀⾏有5个元素
复制代码
7.二维数组的初始化

•在创建变量大概数组的时候,给定⼀些初始值,被称为初始化
•⼆维数组的初始化与⼀维数组⼀样,也是使⽤⼤括号初始化
不完全初始化(未给定值的项为0)
  1. 1 int arr[2][4] = {1,3,4};
  2. 2 //   1 2 3 0
  3. 3 //   0 0 0 0
复制代码
完全初始化
  1. 1 int arr[3][4] = {1,2,3,4, 2,4,5,6, 4,3,4,5};
  2. 2 //   1 2 3 4
  3. 3 //   2 4 5 6
  4. 4 //   4 3 4 5
复制代码
按照行初始化
  1. 1 int arr[4][5] = {{1,2},{3,4},{5,6},{7,8}};
  2. 2 //   1 2 0 0 0
  3. 3 //   3 4 0 0 0
  4. 4 //   5 6 0 0 0
  5. 5 //   7 8 0 0 0
复制代码
初始化时可以省略行,但不能省略列
  1. 1 int arr[][3] = {1};
  2. 2 //  1 0 0
复制代码
  1. 1 int arr[][3] = {1,2,3,4};
  2. 2 //  1 2 3
  3. 3 //  4 0 0
复制代码
  1. 1 int arr[][3] = {{1},{2},{3}};
  2. 2 //  1 0 0
  3. 3 //  2 0 0
  4. 4 //  3 0 0
复制代码
8.二维数组的使用

(1)二维数组的下标

•⼆维数组访问与一维数组访问一样,也是使⽤下标的形式,⼆维数组有⾏和列,只要锁定了⾏和列就能唯⼀锁定数组中的⼀个元素
•⼆维数组的⾏是从0开始的,列也是从0开始的
比如:
  1. 1 int arr[3][5] = {1,2,3,4,5, 6,7,8,9,10, 11,12,13,14,15};
复制代码

图中最右侧绿⾊的数字表⽰⾏号,第⼀⾏蓝⾊的数字表⽰列号,都是从0开始,比如要找到7可以这么写arr[1][1]

(2)二维数组的输入和输出

借助循环实现⽣成所有元素的下标
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int arr[3][5] = {0};
  5.         int i = 0;
  6.    
  7.     //输入
  8.         for (i = 0; i < 3; i++)//产生行号
  9.         {
  10.                 int j = 0;
  11.                 for (j = 0; j < 5; j++)//产生列号
  12.                 {
  13.                         scanf("%d", &arr[i][j]);//输入数据
  14.                 }
  15.         }
  16.    
  17.     //输出
  18.         for (i = 0; i < 3; i++)//产生行号
  19.         {
  20.                 int j = 0;
  21.                 for (j = 0; j < 5; j++)//产生列号
  22.                 {
  23.                         printf("%2d ", arr[i][j]);//输出数据
  24.                 }
  25.                 printf("\n");//分行
  26.         }
  27.         return 0;
  28. }
复制代码

9.二维数组在内存中的存储

方法:打印出数组所有元素的地址
  1. #include <stdio.h>
  2. int main()
  3. {
  4.          int arr[3][5] = { 0 };
  5.          int i = 0;
  6.          for (i = 0; i < 3; i++)
  7.          {
  8.                  int j = 0;
  9.                  for (j = 0; j < 5; j++)
  10.                  {
  11.                          printf("&arr[%d][%d]=%p\n",i,j,&arr[i][j]);
  12.                  }
  13.          }
  14.          return 0;
  15. }
复制代码

从输出的结果来看,每⼀⾏内部的每个元素都是相邻的,地址之间相差4个字节,跨⾏位置处的两个元素之间也是差4个字节,以是⼆维数组中的每个元素都是连续存放的
10.C99中的变长数组

•C99中给⼀个变⻓数组(variable-length array,简称VLA)的新特性,允许我们可以使⽤变量指定数组⼤⼩
•变⻓数组的根本特征,就是数组⻓度只有运⾏时才华确定,以是变⻓数组不能初始化
•VS2022上默认的编译器是MSVC,MSVC编译器是不支持C99中的变长数组的,要改写成clang编译器才可以运行(VS2022如何将编译器更改为clang编译器https://blog.csdn.net/Siri_s12/article/details/144242165?spm=1001.2014.3001.5501)
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int n = 0;
  5.         scanf("%d", &n);//根据输⼊数值确定数组的⼤⼩
  6.         int arr[n];
  7.         int i = 0;
  8.         //输入
  9.         for (i = 0; i < n; i++)
  10.         {
  11.                 scanf("%d", &arr[i]);
  12.         }
  13.         //输出
  14.         for (i = 0; i < n; i++)
  15.         {
  16.                 printf("%d ", arr[i]);
  17.         }
  18.         return 0;
  19. }
复制代码
输入6正常输出

输入10正常输出


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

吴旭华

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表