【学习笔记】【C语言】数组

时间:2023-03-08 21:49:39

1. 什么是数组

数组,从字面上看,就是一组数据的意思,没错,数组就是用来存储一组数据的

2. 数组的特点

只能存放一种类型的数据,比如int类型的数组、float类型的数组

里面存放的数据称为“元素”

3. 定义

声明数组的类型

声明数组的元素个数(需要多少存储空间)

4. 格式

元素类型 数组名[元素个数];

比如:int ages[3];

5. 简单使用

简单初始化:int ages[5] = {19, 19, 20, 21, 25};

元素有顺序之分,每个元素都有一个唯一的下标(索引),从0开始

数组元素的访问:a[i]

6. 初始化

初始化方式

int a[3] = {10, 9, 6};

int a[3] = {10,9};

int a[] = {11, 7, 6};

int a[4] = {[1]=11,[0] = 7};

常见错误

int a[];

int[4] a;

int a[b];

a = {10, 11};

a[4] = {10,9,8,5};

7. 内存分析

数组存储空间的大小

存储空间的划分(内存的分配是从高地址到低地址进行的,但一个数组内部元素又是从低到高进行的)

数组名的作用,查看元素地址

数组越界的注意

8. 其他使用

数组与函数参数

数组元素作为函数参数

数组作为函数参数(sizeof注意)

遍历数组元素

两种方式遍历(while循环和for循环)

遍历元素值和元素地址

字符数组的使用

9.代码

 #include <stdio.h>

 int main()
{
// 使用注意
// 都是正确写法
//int ages[5] = {10 , 11, 12, 67, 56};
//int ages[5] = {10, 11};
//int ages[5] = {[3] = 10, [4] = 11};
//int ages[] = {10, 11, 14}; // 错误写法
// int ages[]; // 错误写法
/* 只能在定义数组的同时进行初始化
int ages[5];
ages = {10, 11, 12, 14};
*/ // 正确写法
// int ages['A'-50] = {10, 11, 12, 14, 16};
//int size = sizeof(ages);
//printf("%d\n", size); // 正确写法
/*
int count = 5;
int ages[count];
ages[0] = 10;
ages[1] = 11;
ages[2] = 18;
*/ //printf();
// 错误写法
// 如果想再定义数组的同事进行初始化,数组元素个数必须是常量,或者不写
//int ages[count] = {10, 11, 12}; int ages[] = {, , , }; // 计算数组元素的个数
int count = sizeof(ages)/sizeof(int); for (int i = ; i<count; i++)
{
printf("ages[%d]=%d\n", i, ages[i]);
} return ;
} // 数组的基本使用
void arrayUse()
{
// 数组的定义格式: 类型 数组名[元素个数];
int ages[] = {, , , , };
// 19 19 28 27 26]
ages[] = ; /*
ages[0] = 19;
ages[1] = 19;
ages[2] = 28;
ages[3] = 27;
ages[4] = 26;
*/ /*
遍历:按顺序查看数组的每一个元素
*/
for (int i = ; i<; i++)
{
printf("ages[%d]=%d\n", i, ages[i]);
}
}

数组的内存储存细节

 #include <stdio.h>

 /*
提示用户输入5个学生的成绩,算出平均分并且输出
*/ int main()
{ // 1.定义一个数组来存储成绩
int scores[]; // 2.提示输入成绩
// 用来存储总分
int sum = ;
for (int i = ; i<; i++) {
// 2.1 提示输入某个学生的成绩
printf("请输入第%d个学生的成绩:\n", i + );
// 2.2 存储当前学生的成绩
scanf("%d", &scores[i]);
// 2.3 累加成绩
sum += scores[i];
} // 3.计算平均分,并且输出
printf("平均分是%f\n", sum/5.0);
return ;
} void test1()
{
// 1.定义一个数组来存储成绩
int scores[]; // 2.提示输入成绩
printf("请输入第1个学生的成绩:\n");
scanf("%d", &scores[]); printf("请输入第2个学生的成绩:\n");
scanf("%d", &scores[]); printf("请输入第3个学生的成绩:\n");
scanf("%d", &scores[]); printf("请输入第4个学生的成绩:\n");
scanf("%d", &scores[]); printf("请输入第5个学生的成绩:\n");
scanf("%d", &scores[]); // 3.计算平均分,并且输出
int sum = ;
for (int i = ; i<; i++) {
sum += scores[i];
}
printf("平均分是%f\n", sum/5.0);
} void test()
{
/*
char cs[5]= {'a', 'A', 'D', 'e', 'f'}; printf("%p\n", cs); for (int i = 0; i<5; i++) {
printf("cs[%d]的地址是:%p\n", i, &cs[i]);
}*/ int ages[]= { , , }; printf("%p\n", ages); for (int i = ; i<; i++) {
printf("ages[%d]的地址是:%p\n", i, &ages[i]);
}
}

数组和函数

 #include <stdio.h>

 // 数组作为函数参数,可以省略元素个数
// 数组作为函数参数,传递是整个数组的地址,修改函数形参数组元素的值,会影响到外面的实参数组 void change(int array[])
{
//printf("array==%p\n", array); array[] = ;
} void change2(int n)
{
n = ;
} int main()
{
int ages[] = {, , , , , }; //printf("ages==%p\n", ages); change(ages); //change2(ages[0]); printf("%d\n", ages[]);
return ;
}

练习

 /*

 设计一个函数,找出整型数组元素的最大值
*/ #include <stdio.h> int maxOfArray(int array[], int length)
{
// 数组当做函数参数传递时,会当做指针变量来使用,指针变量在64bit编译器环境下,占据8个字节 //int size = sizeof(array);
//printf("array=%d\n", size); //sizeof(array); // 1.定义一个变量存储最大值(默认就是首元素)
int max = array[]; // 2.遍历所有元素,找出最大值
for (int i = ; i<length; i++)
{
// 如果当前元素大于max,就用当前元素覆盖max
if (array[i] > max)
{
max = array[i];
}
} return max;
} int main()
{
int ages[] = {, , , , , , , , }; int ages2[] = {, , , , , , , , }; //int size = sizeof(ages); //printf("ages=%d\n", size);
int max = maxOfArray(ages, sizeof(ages)/sizeof(int)); printf("%d\n", max);
return ;
}