数组
文章目录
为什么需要数组?
一个养鸡场有6只鸡,它们的体重分别是3kg,5kg,1kg,3.4kg,2kg,50kg 。请问这六只鸡的总体重是多少?平 均体重是多少? 请你编一个程序。
传统方案
1.定义6个double 变量
2.统计他们和,并求出平均值
3.传统的方案,不灵活,不能够完成数量大的需求
4.引出我们讲解 数组
数组介绍
数组可以存放多个同一类型数据,数组也是一种数据类型,是构造类型,传递是以引用的方式传递(即传递的是地址)
一个案例,快速了解数组
#include <stdio.h>
int main(){
/*一个养鸡场有6只鸡,它们的体重分别是3kg,5kg,1kg,
3.4kg,2kg,50kg 。请问这六只鸡的总体重是多少?
平 均体重是多少? 请你编一个程序。*/
//1.定义数组
double hens[6];
double totalWeight = 0.0;
double avgWeight = 0.0;
int i;
int arrLen;//数组的大小
//2.初始化数组的每个元素
hens[0] = 3;//第一个元素
hens[1] = 5;
hens[2] = 1;
hens[3] = 3.4;
hens[4] = 2;
hens[5] = 50;
//3.遍历数组
//如何得到数组大小
//sizeof(hens) 数组的总的大小
//一个double 8个字节 6*8=48
//sizeof(double) 返回一个double占用的字节数
//printf("sizeof(hens)=%d",sizeof(hens));
arrLen = sizeof(hens) / sizeof(double);
for(i=0;i<arrLen;i++){
totalWeight += hens[i];//累计每只鸡体重
}
avgWeight = totalWeight / 6;
printf("总体重totalWeight=%.2f 平均体重avgWeight=%.2f",totalWeight,avgWeight);
getchar();
}
数组定义和内存布局
(1)数组的定义
数据类型 数组名 [数组大小]
int a[5]; //a 数组名,类型int , [5]大小,即a数组最多存放5个int数据赋初值
(2)数组内存图(重要)
![SmartSelect_20221027-101536_Samsung Notes](https://i-blog.csdnimg.cn/blog_migrate/c65f3c7f2505d60fe7658a785a2ec058.jpeg)
说明:
数组名 就代表 该数组的首地址 ,即a[0]地址
数组的各个元素是 连续发布的 ,假如a[0] 地址 0x1122
a[1]地址 = a[0]的地址 + int字节数(4) = 0x1122+4 = 0x1126
a[2]地址 = a[1]地址 + int字节数(4) = 0x1126+4 =0x112A
依次类推
(3)访问数组元素
数组名[下标] 比如:你要使用a数组的第三个元素 a[2], 下标是从0开始计算
(4)小案例
从终端循环输入5个成绩,保存到double数组,并输出
(5)初始化数组的三种方式
数组使用注意事项和细节
数组应用案例
1.创建一个char类型的26个元素的数组,分别 放置’A’-'Z‘。使用for循环访问所有元素并打印出来。提示:字符数据运算 ‘A’+1 -> ‘B’
2.请求出一个数组的最大值,并得到对应的下标。
字符数与字符串
1.字符数组基本介绍
用来存放字符的数组称为字符数组, 看几个案例
char a[10]; //一维字符数组, 长度为10
char b[5][10]; //二维字符数组
char c[20]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a','m'}; // 给部分数组元素赋值
字符数组实际上是一系列字符的集合,也就是字符串(String)。在C语言中,没 有专门的字符串变量,没有string类型,通常就用一个字符数组来存放一个字符串
2.字符串注意事项
(1)在 C 语言中,字符串实际上是使用 null 字符 (‘\0’) 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。
(2)'\0’是ASCII码表中的第0个字符,用NUL表示,称为空字符。该字符既不能显示,也不是控制字符,输出该字符不会有任何效果,它在C语言中仅作为字符串的结束标志。
(3)字符数组(字符串)在内存中的布局分析 [案例]
(4)思考 char str[3] = {‘a’,‘b’,‘c’} 输出什么? 为什么?
结论:如果在给某个字符数组赋值时 (1)赋给的元素的个数小于该数组的长度,则会自动在后面加 ‘\0’, 表示字符串结束,(2)赋给的元素的个数等于该数组的长度,则 不会自动添加 ‘\0’
(5)案例
3.字符串的访问和遍历
因为字符串的本质就是字符数组,因此可以按照数组的方式遍历和访问某个元素即可
案例如下:
字符串的表现形式
1.用字符数组存放一个字符串
char str[]="hello tom";
char str2[] = {'h', 'e'};
2.用字符指针指向一个字符串
char* pStr=" hello tom";
(1)C语言对字符串常量" hello tom"是按字符数组处理的,在内存中开辟了一个字符数组用来存放字符串常量,程序在定义字符串指针变量str时只是把字符串首地址(即存放字符串的字符数组的首地址)赋给pStr
(2)printf(“%s\n”,str); 可以输出 str 指向的字符串
(3)对应的内存布局图
3.使用字符指针变量和字符数组两种方法表示字符串的讨论
(1)字符数组由若干个元素组成,每个元素放一个字符;而字符指针变量中存放的是地址(字符串/字符数组的首地址),绝不是将字符串放到字符指针变量中(是字符串首地址)
(2)对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值
char str[14];//str实际是一个常量(存的地址),常量不能改变
str=" hello tom"; //错误
str[0] = 'i'; //ok
(3)对字符指针变量,采用下面方法赋值, 是可以的
因为指针是变量,可以改变它的指向
char* a="yes";
a=" hello tom";
理解:a是指针变量(自身是有地址的),原先它指向了yes的空间,现在指向hello tom,之后yes这个空间被回收,实质就是指向的地址改变了
代码演示:
(4)如果定义了一个字符数组,那么它有确定的内存地址(即字符数组名是一个常量);而定义一个字符指针变量时,它并未指向某个确定的字符数据,并且可以多次赋值
字符串相关函数
1.常用字符串函数
2.案例演示
字符串(字符数组)使用注意事项和细节
(1)程序中往往依靠检测 ‘\0’ 的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。因此,字符串长度不会统计 ‘\0’, 字符数组长度会统计
(2)在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度,否则,在输出字符数组时可能出现未知字符.
(3)系统对字符串常量也自动加一个’\0’作为结束符。例如"C Program”共有9个字符,但在内存中占10个字节,最后一个字节’\0’是系统自动加上的。(通过sizeof()函数可验证)
(4)定义字符数组时,如果 给的字符个数 比 数组的长度小,则系统会默认将剩余的元素空间,全部设置为 ‘\0’, 比如 char str[6] = “ab” , str内存布局就是[a][b][\0][\0][\0][\0]
(5)字符数组定义和初始化的方式比较多,比如
char str1[ ]={"I am happy"}; // 默认后面加 '\0'
char str2[ ]="I am happy"; // 省略{}号 ,默认后面加 '\0'
char str3[ ]={'I',' ','a','m',' ','h','a','p','p','y'}; // 字符数组后面不会加 '\0', 可能有乱码
char str4[5]={'C','h','i','n','a'}; //字符数组后面不会加 '\0', 可能有乱码
char * pStr = "hello";