目录
数组
1、数组的概念:
数组在内存当中是一块连续的空间,可以保存相同类型的多个数据的容器。
2、数组的特点:
数组中保存的数据必须是相同的数据类型。
数组是定长的(数组一旦定义 那么长度是不可改变的)。
一、一维数组
1、一维数组的定义
格式如下:
类型说明符 数组名[常量表达式]
例子:
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//arr数组名 [10]有10个元素 元素用{}括起来
printf("%d\n", arr[0]);
return 0;
}
注意:
1、数组名的命名规则与变量名的命名规则一样:
a、不能使用系统关键字;
b、允许使用字母、数字和下划线;
c、不允许数字开头;
d、标识符区分大小写;
2、数组定义的常量表达式的值表示数组元素的个数;
3、可以在同一类型说明中定义多个数组和变量;
4、在同一函数中,其他变量名不能与数组名相同;
5、一个数组的所有元素是同种类型的;
6、[]内的常量表达式可以是符号常量,但不能是变量。
2、一维数组元素的引用和初始化
1)、一维数组元素的引用
数组元素的表示形式是“数组名[下标]”,下标可以是整型常量也可以是整形表达式,下标的取值范围是0到“数组长度-1”范围内的整数。
注意:数组只有定义,才可以引用数组的元素。
2)、一维数组元素的初始化
数组被定义时,数组元素没有初始值。
3、一维数组程序设计举例
十只小猪称体重。
输入十只小组的体重,输出最重小猪的体重。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define S 10 //小猪的数量 便于更改
int main()
{
//输入十只小猪的体重 输出最重小猪的体重
int arr[S], i;
for (i = 0; i < S; i++)
{
scanf("%d", &arr[i]);
}
//输入小猪的体重
int max = arr[0];
for (i = 1; i < S; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
printf("最重的小猪的体重为:%d\n", max);
return 0;
}
一维数组的逆置
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
int j = sizeof(arr) / sizeof(arr[10]) - 1;
//数组元素个数-1
while (i < j)
{
//通过临时变量交换数据
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
for (i = 0; i < 10; i++)
{
printf("%d\n", arr[i]);
}
//结果为10到1
return 0;
}
冒泡排序法:
将相邻的两个元素进行比较,如果前面一个元素比后面一个元素大,就交换位置,直到比较完整的数组。完成之后就将最大的数放到了最后一个位置,也就是说在这一轮可以将最大元素交换到最后。接下来就是重复之前的操作将倒数第二大的数放在倒数第二的位置上,依次进行直到将所有的数排序好,就结束循环。
#include<stdio.h>
int main()
{
int arr[10] = { 3,2,4,5,1,6,7,9,8,10 };
//一个无序数组
int i,j;
for (i = 0; i < 10 - 1; i++)
//控制行 执行次数为元素个数-1
{
for (j = 0; j < 10 - 1 - i; j++)
//控制列 执行次数为元素个数-1-执行次数
{
if (arr[j] > arr[j + 1])
//比较两个元素 满足条件交换
//通过符号控制排序的方式升还是降
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (i = 0; i < 10; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
二、二维数组
1、二维数组的定义
二维数组的一般定义格式如下:
类型说明符 数组名[常量表达式1][常量表达式2]
列如:定义int型二维数组arr包含100(20行5列)个数组元素。
int arr[20][5];
//第一个[]表示行,第二个[]表示列
二维数组中的元素先存放第一行的元素,再存放第二行的元素,依次下去。
也可以把二维数组看成特殊的一维数组,这个一维数组的每个元素又是一个一维数组。
2、二维数组的引用和初始化
1)、二维数组的引用
二维数组引用的格式如下:
数组名[行下标][列下标]
行下表可以是整型变量,也可以是整型表达式。
行下标、列下标都是从0开始,且均小于数组的行数和列数。
操作二维数组的时候,需要使用双重循环。一般都是外层控制数组行,内层控制数组列。
#include<stdio.h>
int main()
{
int arr[2][3]=
{
{1,2,3},
{4,5,6}
};//第一个是行 第二个是列
arr[1][1] = 8;//改变数值
int i, j;
for (i = 0; i < 2; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
列如:对于之前的那个二维数组第三行第五列的元素表示为
arr[4][6]
2)、二维数组的初始化
1、可以分行给二维数组赋值
int arr[2][3]={{1,2,3},{4,5,6}};
//表示将{1,2,3}分别赋值给第一行的3个元素,将{4,5,6}分别赋值给第二行的3个元素。
2、可以用一个{}按顺序给各元素赋值,上面的可以写成
int arr[2][3]={1,2,3,4,5,6};
3、也可以只写出部分元素的初值,其余的都是0。
4、可以省略行数,如:
int arr[][3]={1,2,3,4,5,6};
列数不能省略。
3、二维数组程序设计举例
运用二维数组的知识:
定义一个数组 存储五名学生三门成绩
求出每名学生的总成绩 平均成绩
求出每门学科的总成绩 平均成绩按学科成绩输出时将列不变,改变行的下标来实现输出信息
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
/*
定义一个数组 存储五名学生三门成绩
求出每名学生的总成绩 平均成绩
求出每门学科的总成绩 平均成绩
*/
int arr[5][3];
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 3; j++)
{
scanf("%d", &arr[i][j]);
}
}
//获取学生成绩
for (i = 0; i < 5; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
//打印学生成绩
for (i = 0; i < 5; i++)
{
int sum = 0;
for (j = 0; j < 3; j++)
{
sum += arr[i][j];
}
printf("第%d名学生的总成绩是:%d\t平均成绩是:%d\n", i + 1, sum, sum / 3);
}
for (i = 0; i < 3; i++)
{
int sum = 0;
for (j= 0; j < 5; ++j)
{
sum += arr[j][i];
}
printf("第%d门学科的总成绩是:%d\t平均成绩是:%d\n", i + 1, sum, sum / 5);
}
return 0;
}
三、字符数组与字符串
1、字符数组的定义
可以使用字符数组存放字符型数据。
C语言用字符数组存放字符串,字符数组中的各元素依次存放字符串的各字符。
字符数组定义举例:
char arr[100],ch[50];
其中定义了有100个字符元素的字符数组arr和有50个字符元素的字符数组ch。
字符数组也可以是二维。例如:
char a[100][10];
其中a是有100行10列的二维字符数组。
注意:每个字符数组元素占1字节的内存空间,可以存放一个字符。
2、字符数组元素的引用和初始化
1)、字符数组元素的引用
字符数组元素的引用方式有以下两种方式:
数组名[下标]
数组名[行下标][列下标]
2)、字符数组元素的初始化
字符数组元素的初始化就是在定义数组时为数组元素赋初值。
列如:下面是对字符数组arr的每个数组元素赋一个字符
char arr[5] = { 'h','e','l','l','o' };
若数组元素的个数与{}中的字符个数相同,则可以省略数组长度,即[]中的数可以不写。
也可以给字符数组arr的部分数组元素赋值。例如:
char arr[10] = { 'h','e','l','l','o' };
3)、字符串
在C语言中,没有专门的字符串变量,通常用字符数组来存放字符串。C语言规定,用字符'\0'作为字符串结束标志。因此可以用'\0'来判断字符串是否结束。从字符串的第一个字符开始向后逐个检查字符,遇到'\0'时,表示字符串结束了。
用printf函数输出一个字符串:
printf("hello world");
系统自动在"hello world"的尾部加了一个'\0',即在内存中实际是"hello world\0"。系统在输出改字符串时,从第一个字符开始到'\0'结束。
使用字符串常量,可以对一个字符型数组初始化。例如:
ch arr[6]={"hello"};
该定义等价于
ch arr[6]={'h','e','l','l','e','\0'};
在使用字符串常量进行初始化时,可以省略{}和数组长度。
ch arr[]="hello";
注意:下面的定义与上面的几种定义形式不等价。
ch arr[]={'h','e','l','l','e'};
这里省略的数组长度是5,而不是6。
下面是一小段代码:字符的输入和输出以及将两个字符串连接
#include<stdio.h>
int main()
{
char arr[5] = { 'h','e','l','l','o' };
//定义字符数组
int i;
for (i = 0; i < 5; i++)
{
printf("%c", arr[i]);
}
//结果为hello
//字符串拼接
char ch1[] = "hello";
char ch2[] = "world";
char ch3[11];
//数字可以大不能小
int j = 0;
int k = 0;
while (ch1[j] != '\0')
{
ch3[j] = ch1[j];
j++;
}
while (ch2[k] != '\0')
{
ch3[k + j] = ch2[k];
k++;
}
ch3[j + k] = '\0';//表示字符数组结束
printf("%s", ch3);
//结果为helloworld
return 0;
}
总结
这里介绍了数组的一些知识(最基本的)。
我认为掌握一个知识知识点最快的方法就是使用它。