一、数组简介
1、数组属于构造类型
2、什么是数组:具有相同数据类型的成员组成的一组数据
3、整型数组、浮点型数组、字符数组、字符串数组。数组前的修饰词表示数组中存储的成员数据类型。
二、定义数组
类型修饰符 数组名[常量表达式] = {值1,值2,值3,...};
说明:
1、类型修饰符:声明了成员的数据类型
2、[]中的值决定了数组中成员的数量
3、{}中设置数组中的成员
数组定义方式:
方式1,
定义整型数组,存数三个学生的年龄
int ages[3] = {18, 17, 20};
方式2
没有赋初值的成员系统自动设置为0.
int b[5] = {4, 5, 6};
方式3
没有赋初值的数组,系统自动默认数组元素全部为0.
int c[5] = {0};
方式4
根据初始化的数组元素个数,系统自动推断数组中成员的数量
int d[] = {7, 8, 9,10};
错误方式1
指定的数组成员数量 < 实际初始化成员的数量
int e[3] = {1, 2, 3, 4};
错误方式2
理论上来说此种设置正确的,数组元素个数为1,初始值为1.但是如果在后面的程序中需要赋的值大于数组声明的元素个数,则会出现错误,不建议使用,故归为错误的定义方式。
int f[]= {0};
三、数组元素
1、数组元素:数组中的成员
2、数组下标:数组元素的序号。
注:数组下标从0开始,即第一个元素的下标为0,后面的元素下标一次增加1。
3、数组所占的存储空间
元素个数 * 每个元素所占的字节数,数组的存储空间是连续的。
四、使用数组
1、访问数组元素
a、不能通过数组名来一次性访问所有的数组元素
b、访问数组元素:通过 数组名[下标] 访问某个数组元素
c、下标可以使用常量或变量
2、读取数组元素的值
int age[5] = {12,15, 20, 26};
printf("%d\n",age[0]);// 读取第一个元素中的值
printf("%d\n",age[3]);// 读取第四个元素中的值
3、遍历数组
按照顺序,从第一个元素开始访问,到最后一个元素结束。使用for循环实现数组遍历
for (int i = 0; i< 5; i++) {
printf("%d ", age[i]);
}
printf("\n");
反向遍历数组
for (int i = 4; i>= 0; i--) { // i自减
printf("%d ", age[i]);
}
4、修改数组元素的值
int a[] = {1, 2, 3, 4, 5};
a[0] = 19;
a[4] = 25;
for (int i = 0; i< 5; i++) {
printf("%d ", a[i]);
}
5、数组越界:使用数组下标时,超出下标范围
int a[10] = {0}; 下标范围 0~9, a[10]即为越界
注意:C语言中,编译器不会检测下标是否越界
6、注意事项:
a、区分定义数组和数组元素
b、数组作为一个整体,不能直接参与运算。数组名是一个符号常量,表示数组首元素的地址
例题:
生成 2个数组,每个数组都有 10个元素 ,元素取值范围 20-40之间,数组对应元素相加,放到另外一个数组中。
int a[10] = {0};
int b[10] = {0};
int c[10] = {0};
for (int i = 0; i< 10; i++) {
a[i] = arc4random() % 21 + 20;
b[i] = arc4random() % 21 + 20;
c[i]= a[i] + b[i];
printf("%d", a[i]);
printf("%d ", b[i]);
printf("%d ", c[i]);
printf("\n");//打印一次换行一次
}
五、数组排序
1、排序的规律:升序、降序
2、冒泡排序的基本思路:每次将相邻的两个数进行比较,按照升序或降序的顺序进行交换,直到所有数字的顺序全部正确
3、冒泡排序需要两层循环实现
(1)外层循环 控制排序的趟数
(2)内层循环 控制每趟排序中,比较的次数
冒泡排序举例:
int a[5] = {5, 4, 3,2, 1};
// 外层循环 控制比较趟数
for (int i = 0; i< 5-1; i++) {
// 内层循环 控制比较的次数
for (int j = 0; j < 5-(i+1); j++) {
// 比较相邻的两个数,根据比较规则,实现排序
if (a[j] > a[j+1]) { // j即是数组元素的下标,也控制比较的次数
//a[j] > a[j+1],升序排列; a[j] < a[j+1],降序排列
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
//遍历数组
for (int i = 0; i< 5; i++) {
printf("%d ", a[i]);
}
例题:
获取字符中的最大值,并找出所在的位置
int b[5] = {1, 3, 5,8, 6};
int max = b[0];
int max = 0; 前提是数组中的元素必须全部是正整数
for (int i = 0; i< 5; i++) {
if (max < b[i]) {
max = b[i];
}
}
printf("%d", max);
//找出最大值的位置
for (int i = 0; i< 5; i++) {
if (b[i] == max) {
int index = i;//获取最大值所在的下标
printf("%d ", index+1);
}
}
六、字符数组
char a[5] = {'h','e', 'l', 'l', 'o',};
char b[10] = {'i','p', 'h', 'n', 'o', 'e'};
1、未设置初始值的元素,默认设置为‘\0’, '\0'是空操作符,不能显示
2、访问字符数组
读取字符数组a中的第一个元素
printf("%c\n",a[0]);
遍历数组b
for (int i = 0; i< 10; i++) {
printf("%c ", b[i]);
}
七、字符串
1、字符串常量 “love” “helloworld”
2、使用%s实现输入输出字符串。
3、系统如何识别字符串。从第一个字符开始读取,知道遇见‘\0’结束。
4、‘\0’是字符串结束标志。
注意:使用字符数组存储字符串
字符数组在内存中是:n个连续的字符
字符串在内存中是:n个连续的字符
char name[] = "hello";
存储字符串的字符数组,元素个数 = 可见的字符数量+1
输出字符串
printf("%s", name);
八、字符数组和字符串数组关系
1、字符串是一个字符数组
char a[] = "hello";
char b[] = {'h', 'e', 'l', 'l', '0','\0'};
a、b都是字符数组,两个数组中存储的都是字符串“hello”,都可以访问元素
2、字符数组 不一定是 字符串
char a[] = "hello";
char b[] = {'h', 'e', 'l', 'l', 'o'}; // 无'\0'字符
数组a中存储的是一个字符串,数组b中存储的是5个字符
3、如果数组中存储的是字符串,可以输出单个字符,也可以使用%s输出完整的字符串。使用%s输出时,遇到'\0'时即结束输出。
4、访问字符串中的元素
char a[] = "hello";
for (int i = 0; i < 6; i++) {
printf("%c ", a[i]);
}
printf("%s \n", a);
九、处理字符串的函数
1、strlen()测量字符串的长度
测量的是字符串中可见字符的数量,不包含‘\0’。Strlen返回值为unsigned long类型,输出使用%lu。
char name[] = "zhangsan";
printf("%lu\n",strlen(name));
printf("%lu\n",strlen("zhangsan"));
2、strcpy 字符串拷贝
strcpy(字符数组1, 字符数组2);将字符数组2复制到字符数组1中
拷贝字符串的时候需要将字符数组2中的'\0'也拷贝过去。
字符数组1的存储空间 >= 字符数组2的存储空间
char a[10] = {0};
char b[] = "zhangsan";
strcpy(a, b);
printf("%s ", a);
for (int i = 0; i< 10; i++) {
printf("%c ", a[i]);
}
3、字符串拼接
strcat(字符数组1, 字符数组2);将字符数组2中的内容拼接到字符数组1的内容后面
字符数组1的存储空间必须足够大
拼接之后,字符串1的'\0'被取消了,只保留字符串2的'\0'
char a[30] ="hello";
char b[] = "world";
strcat(a, b);
printf("%s\n",a);
4、字符串比较
strcmp(字符串1, 字符串2)
将两个字符串自左向右,逐个字符进行比较(按ASCII码值进行比较),直到出现不同的字符或者遇到‘\0’
用字符串1 - 字符串2
字符串1 = 字符串2, strcmp返回结果为0
字符串1 > 字符串2, strcmp返回结果大于0
字符串1 < 字符串2, strcmp返回结果小于0
char m[] ="abc";
char n[] ="abC";
printf("%d\n",strcmp(m, n));
printf("%d\n",strcmp(n, m));