[重点]C语言——数组

数组

文章目录

  • 数组
    • 为什么需要数组?
    • 数组介绍
    • 一个案例,快速了解数组
    • 数组定义和内存布局
      • (1)数组的定义
      • (2)数组内存图(重要)
      • (3)访问数组元素
      • (4)小案例
      • (5)初始化数组的三种方式
    • 数组使用注意事项和细节
    • 数组应用案例
      • 1.创建一个char类型的26个元素的数组,分别 放置'A'-'Z‘。使用for循环访问所有元素并打印出来。**提示**:字符数据运算 'A'+1 -> 'B'
      • 2.请求出一个数组的最大值,并得到对应的下标。
    • 字符数与字符串
      • 1.字符数组基本介绍
      • 2.字符串注意事项
      • 3.字符串的访问和遍历
    • 字符串的表现形式
      • 1.用字符数组存放一个字符串
      • 2.用字符指针指向一个字符串
      • 3.**使用字符指针变量和字符数组两种方法表示字符串的讨论**
    • 字符串相关函数
    • 字符串(字符数组)使用注意事项和细节

为什么需要数组?

一个养鸡场有6只鸡,它们的体重分别是3kg,5kg,1kg,3.4kg,2kg,50kg 。请问这六只鸡的总体重是多少?平 均体重是多少? 请你编一个程序。

传统方案

1.定义6个double 变量

2.统计他们和,并求出平均值

3.传统的方案,不灵活,不能够完成数量大的需求

4.引出我们讲解 数组


数组介绍

数组可以存放多个同一类型数据,数组也是一种数据类型,是构造类型,传递是以引用的方式传递(即传递的是地址

一个案例,快速了解数组

#include 

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();
}

image-20221027095254628

数组定义和内存布局

(1)数组的定义

数据类型 数组名 [数组大小]
int a[5]; //a 数组名,类型int , [5]大小,即a数组最多存放5个int数据赋初值

(2)数组内存图(重要)

[重点]C语言——数组_第1张图片

说明:

数组名 就代表 该数组的首地址 ,即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数组,并输出

[重点]C语言——数组_第2张图片

(5)初始化数组的三种方式

[重点]C语言——数组_第3张图片

数组使用注意事项和细节

[重点]C语言——数组_第4张图片

[重点]C语言——数组_第5张图片

[重点]C语言——数组_第6张图片

数组应用案例

1.创建一个char类型的26个元素的数组,分别 放置’A’-'Z‘。使用for循环访问所有元素并打印出来。提示:字符数据运算 ‘A’+1 -> ‘B’

[重点]C语言——数组_第7张图片

2.请求出一个数组的最大值,并得到对应的下标。

[重点]C语言——数组_第8张图片

字符数与字符串

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)字符数组(字符串)在内存中的布局分析 [案例]

[重点]C语言——数组_第9张图片

(4)思考 char str[3] = {‘a’,‘b’,‘c’} 输出什么? 为什么?
结论:如果在给某个字符数组赋值时 (1)赋给的元素的个数小于该数组的长度,则会自动在后面加 ‘\0’, 表示字符串结束,(2)赋给的元素的个数等于该数组的长度,则 不会自动添加 ‘\0’

(5)案例

[重点]C语言——数组_第10张图片

3.字符串的访问和遍历

因为字符串的本质就是字符数组,因此可以按照数组的方式遍历和访问某个元素即可

案例如下:

[重点]C语言——数组_第11张图片

字符串的表现形式

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)对应的内存布局图

[重点]C语言——数组_第12张图片

3.使用字符指针变量和字符数组两种方法表示字符串的讨论

(1)字符数组由若干个元素组成,每个元素放一个字符;而字符指针变量中存放的是地址(字符串/字符数组的首地址),绝不是将字符串放到字符指针变量中(是字符串首地址)

(2)对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值

char str[14];//str实际是一个常量(存的地址),常量不能改变
str=" hello tom"; //错误
str[0] = 'i'; //ok

[重点]C语言——数组_第13张图片

(3)对字符指针变量,采用下面方法赋值, 是可以的

因为指针是变量,可以改变它的指向

char* a="yes";
a=" hello tom";

理解:a是指针变量(自身是有地址的),原先它指向了yes的空间,现在指向hello tom,之后yes这个空间被回收,实质就是指向的地址改变了

[重点]C语言——数组_第14张图片

代码演示:

[重点]C语言——数组_第15张图片

(4)如果定义了一个字符数组,那么它有确定的内存地址(即字符数组名是一个常量);而定义一个字符指针变量时,它并未指向某个确定的字符数据,并且可以多次赋值

字符串相关函数

1.常用字符串函数

[重点]C语言——数组_第16张图片

2.案例演示

[重点]C语言——数组_第17张图片

字符串(字符数组)使用注意事项和细节

(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";

[重点]C语言——数组_第18张图片

你可能感兴趣的:(C学习笔记篇,c语言,算法,c++)