前言
在使用计算机对数据进行处理时,硬件具有相同数据类型的数据量河大(如全班同学的成绩等),对于这种需要数据量非常大的程序,需要把同一类型的数据按一定形式有序地组织起来,这有序存储数据地集合为数组。
其结构:
- 数组用于存储一组数据
- 数组里面存储的数据类型必须是相同的
- 数组在内存中会开辟一块连续的空间
定义数组表明:
- 数组元素的类型
- 数组元素的总个数
注意 :在C中,数组的下标是从0开始!
一、🍒一维数组
①、一维数组:数组元素只有一个下标的组数。
②、一维数组定义:
如:
int a[5];//定义一个名为a的数组,数组中的每一个元素都是int类型,一共有10个元素
//每一个元素都保存在一个变量中,每一个变量都由数组名和数组下标组成
并且都是从0开始的,分别是a[0] a[1]....a[4]
也可以用宏定义#definr
#define a 9
....
int i[a];
③、所需要的内存字节数
④、数组的引用
int i[9]; //定义数组,且长度为9
a = i[9]; //引用数组i中数组为9的值,赋值给a,9代表的是数组下标
⑤、一维数组的初始化
- 如果不初始化,直接使用数组会是随机值
#include <stdio.h>
void main()
{
int c[4];
printf("%d\n", c[0]);
printf("%d\n", c[1]);
printf("%d\n", c[2]);
printf("%d\n", c[3]);
}
- 在定义数组时——直接对全部数组元素赋初值
int i, a[6]={1, 2, 3, 4, 5, 6};
- 可以只给一部分元素赋值,没有赋值的元素默认值为0 —— 部分初始化
inr a[6] ={10, 20, 30};
- 在对全部数组元素赋初值,可不指定数组长度,系统会自动分配
int a[]={10, 20, 30, 40, 50};
void main()
{
int a[10];
//如果定义数组的同时 赋值(初始化),可以不指定数组元素的个数
int b[] = {1, 2, 3};
//通过sizeof来获取数组大小
printf("sizeof(a) = %d\n", sizeof(a)) ;
printf("sizeof(b) = %d\n",sizeof(b));
}
注意点&注意事项
注意点:
- 数组名不允许与其他变量名相同
- 定义数组尾部需要添加分号;
- []中括号内不要使用动态定义。
注意事项: - 一维数组赋值时,只能逐个赋值,不能给数组整体赋值
- 若初值的类型与数组元素不一致,则把初值类型转换为数组元素类型
- 避免数组越界
二、🍒二维数组
二维数组的生活例子:学校的课程表,公司工资表
①、表示形式:
在C中,二维数组是按行排列,先存放a[0]行内所有数组元素,再存放a[1]行内的所有数组元素。
int a[2][2];
即:
a[0][0] a[0][1]
a[1][0] a[1][1]
注意:
二维数组也是连续开辟空间,访问元素的行和列都是从0开始
在初始化时行数可以省略,列数不能省略
②、引用:
③、初始化:
- 按行连续赋值
int a[2][2]={1, 2, 3, 4};
即:
{1, 2
3 ,4}
- 赋值省略行下标,
不可省略列下标
int a[][3]= {1, 2, 3, 4, 5, 6}
- 按行分段赋值
在分行赋值,可以对部分元素赋值,没有初始化的部分自动为 0。部分初始化
int a[2][3]={{1, 2, 3}, {4, 5, 6}};
int a[2][3]={{1, 2},{4,,5}};
- 可对数组元素赋值,逐个初始化
int a[2][3];
a[0][0] = 1;
void main()
{
int c[2][4];
//二维数组的行数可以省略,但是列数不能省略,在初始化可以这样子操作
//系统会根据列数自动指定行数,最终得到的函数所得的元素个数是列的整数倍。
int d[][4] = {1,2,3,4,5};
printf("sizeof(c) = %d\n", sizeof(c)) ;
printf("sizeof(d) = %d\n",sizeof(d));
}
补充:一二维数组的遍历
#include <stdio.h>
void main()
{
//一维数组的遍历
int a[6] = {111, 222, 333, 444, 555, 666};
a[3] = 999;
int i;
for(i = 0; i < sizeof(a) / sizeof(int); i++)
{
printf("%d\n", a[i]);
}
//二维数组的遍历
int b[3][4] = {1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12} ;
b[2][0] = 666;
int m, n;
for(m = 0; m < 3; m++)
{
for(n = 0; n < 4; n++)
{
printf(" %d ", b[m][n]);
}
printf("\n");
}
}
三、🍒字符数组
①、定义 & 引用:
定义:
char c[2];
引用:
c[0]='A';
C[1]='e';
②、初始化:
-
逐个字符赋给数组
-
定义字符数组时进行初始化,看省略数组长度
-
字符串给字符数组赋初值
char c[2]= {'a','b'};
char c[]= {'a','b'};
char c[]={"ab"};
③、字符数组结束标志:’\0’
用字符串方式赋值要比用字符逐个赋值要多占1,字符数组保存字符串以 ’ \0 '作为串结束符。这样使得数组长度要+1
④、字符数组的输出
- 使用‘%c’输出
- 使用‘%s’输出
使用‘%c’输出
for(i = 0; i < 5; i++)
{
printf("%c", c[i]);
}
使用‘%s’输出
char c[] ="GoodDay!";
printf("%s", c);
使用‘%s’输出需要注意几点
1 输出的字符不包括‘\0’
2 ‘%s’ ,printf输出项是字符数组名
3 数组长度 > 字符串实际长度,只输出到‘\0’.
4 一个字符数组包含多个‘\0’,遇到第一个就结束。
⑤、字符数组的输入
- 使用‘%c’输入
- 使用‘%s’输入
使用‘%c’输入
for(i = 0; i < 10; i++)
{
scanf("%c", &c[i]);
}
使用‘%s’输入
char s[9];
scanf("%s", s);
void main()
{
char ch[32] = ""; // 通过“”d的方式可以清除字符数组中的垃圾字符,让每一个元素都是‘\0’
scanf("%s", ch);
printf("ch = %s\n", ch);
}
四、🍒字符串处理函数
①、字符串复制
②、字符串连接
③、字符串比较
功能:将字符串与另一个字符串从首字母开始比较
④、字符串大小写转换
⑤、获取字符串长度
功能:计算字符串的实际长度,返回长度不包含‘\0’