目录
1.数组的概念
数组是一组相同类型元素的集合,分为一维或者多维
2.一维数组的创建与初始化
2.1数组创建
基本语法
type arr_name[常量];
其中type表示类型;arr_name表示数组名,名字根据所需起 ;常量表示数组元素个数。
例如:存储20个人的数学成绩
int math[20];
2.2数组的初始化
数组在创建时,需给定一些初始值,称为初始化。
如何初始化?一般使用大括号。
int arr1[5] = { 1,2,3,4,5 };//完全初始化
int arr2[5] = { 1,2,3,4 };//不完全初始化
int arr3[4] = { 1,2,3,4,5 };//错误初始化
2.3数组的类型
数组也是有类型的,算是一种自定义类型
int arr[10];---------->int [10]
char ch[5];---------->char [5]
3.一维数组的使用
3.1数组下标
C语言规定数组是有下标的,下标从0开始,假设有n个元素,最后一个元素下标就是n-1
C语言中数组的访问提供了一个操作符[],这个操作符叫:下标引用操作符。有了它,就可以访问数组元素了。
例如访问下标为7的元素使用arr[7]
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", arr[7]);
return 0;
}
3.2数组元素的打印
如果想访问整个数组的内容,怎么做?
只需产生数组所有元素的下标就行了。运用for循环产生0~9下标,使用下标访问就行了
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
3.3数组的输入
当我们明白如何访问数组元素,也可以根据自身需求,自己给数组输入想要的数据
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = { 0 };
for (i = 0; i < 10; i++)
{
scanf("%d",&arr[i]);
}
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
4.一维数组在内存中的存储
依次打印数组元素的地址
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0; i < 10; i++)
{
printf("arr[%d] = %p\n",i, &arr[i]);
}
return 0;
}
从输出的结果我们分析,数组随着下标的增长,地址是由小到大变化的,并且我们发现每两个相邻的元素之间相差4(因为⼀个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的。
5.sizeof计算数组元素的个数
sizeof可计算类型或变量的大小,其实sizeof也可以计算数组的大小
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", sizeof(arr));
return 0;
}
输出结果为40,计算的是数组所占空间总大小,单位是字节。
我们又知道数组中所有元素的类型都是相同的,那只要计算出⼀个元素所占字节的个数,数组的元素个数就能算出来。这里我们选择第一个元素算大小就可以。
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int s = sizeof(arr) / sizeof(arr[1]);
printf("%d\n",s);
return 0;
}
这里的结果是:10,表示数组有10个元素。
6.二维数组的创建
6.1概念
若把一维数组作为数组元素,就是二维数组。二维数组以上的数组称为多维数组。
6.2创建
基本的语法结构
type arr_name[常量][常量];
eg. int arr[3][5];
注:3表示3行,5表示一行有5列。
7.二维数组的初始化
7.1不完全初始化
int arr1[3][5]={1,2};
7.2完全初始化
int arr2[3][5]={1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
7.3按照行初始化
int arr3[3][5]={{1,2},{3,4},{5,6}};
7. 4初始化时省略行,但不能省略列
int arr4[ ][5]={1, 2, 3};
8. 二维数组的使用
8.1二维数组的下标
二维数组有行有列,只要锁定行与列就可以找到一个元素了
#include <stdio.h>
int main()
{
int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
printf("%d", arr[2][2]);
return 0;
}
8.2二维数组的输入与输出
知道如何访问一个数组的一个元素,如何访问整个数组呢
#include <stdio.h>
int main()
{
int i;
int arr[3][5];
for (i = 0; i < 3; i++)
{
int j;
for (j = 0; j < 5; j++)
scanf("%d",&arr[i][j]);
}
for (i = 0; i < 3; i++)
{
int j;
for (j = 0; j < 5; j++)
printf("%d ",arr[i][j]);
}
return 0;
}
9.二维数组在内存中的存储
从输出结果看,每行内部的每个元素都是相邻的,地址间差4个字节。跨行位置的两个元素之间也是差4个字节,所以二维数组中的每个元素都是连续存放的。
#include <stdio.h>
int main()
{
int arr[2][4] = { 1,2,3,4, 5,6,7,8 };
int i;
for (i = 0; i < 2; i++)
{
int j;
for (j = 0; j < 4; j++)
printf("arr[%d][%d]=%p\n", i, j, &arr[i][j]);
}
return 0;
}
10.C99中变长数组
作用:允许使用变量指定数组大小
int n=a+b;
int arr[n];
上面实例arr就是变长数组,它的长度取决于变量。
注:变长数组的根本特征就是数组长度只有运行时才能确定,故变长数组无法初始化。VS2022无法使用,我们在Dc++中使用。
#include<stdio.h>
int main()
{
int n=0;
printf("ÇëÊäÈëarr[n]ÖеÄn\n");
scanf("%d",&n);
printf("ÇëÊäÈëÊý×éÔªËØ\n");
int arr[n];
int i;
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
for(i=0;i<n;i++)
printf("%d ",arr[i]);
}