1、数组
概念
构造数据类型之一
数组是具有一定顺序关系的若干个变量的集合,组成数组的各个变量称为数组的元素。
数组中各元素的数据类型要求相同,用数组名和下标确定。数组可以是一维的,也可以多维
数组就是一组相同类型的数据
数组就是用一段连续的空间存储相同类型的变量
数组的定义
//定义数组前 必须明确 有几个元素 每个元素类型啥?
//需求:定义一个数组 有10个元素 每个元素为int类型
//数组定义步骤:
//1、数组名 与[]结合是数组 (与*结合是指针 与()是函数)
//2、将元素的个数 放入[]中
//3、用元素的类型 定义一个变量
//4、从上往下 整体替换
int arr[10];
数组元素的描述
void test01()
{
//有10个元素 元素的下标从0开始 0~9
//arr[0] 第0个元素 ~arr[9]第9个元素
int arr[10];
//arr数组名作为类型 代表的是数组的总大小 = 元素的个数 * 每个元素的大小
printf("sizeof(arr) = %d\n",sizeof(arr));//数组的总大小
printf("sizeof(arr[0]) = %d\n",sizeof(arr[0]));//第0个元素的大小
//数组的个数 = 数组的总大小 / 元素的大小
int n = sizeof(arr)/sizeof(arr[0]);//元素的个数
//数值数组 不能整体操作 只能逐个元素操作
for (int i = 0; i < n; i++)
{
//{}里面定义的数组为局部数组 不初始化 内容为随机
printf("第%d个元素为%d\n", i, arr[i]);
}
}
数组的初始化
void test02()
{
//全部初始化 元素的个数可以省略
// int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//如果数组的元素个数省略 元素实际个数 由初始化决定
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int n = sizeof(arr)/sizeof(arr[0]);
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
//部分初始化 未被初始化的部分自动补0
int arr2[10] = {1,2,3,4,5};
n = sizeof(arr2)/sizeof(arr2[0]);
for (int i = 0; i < n; i++)
{
printf("%d ", arr2[i]);
}
printf("\n");
//部分初始化的妙用(清空数组)
int arr3[10] = {0};//将第0个元素初始化为0 其他自动补0 所以全部为0
n = sizeof(arr3)/sizeof(arr3[0]);
for (int i = 0; i < n; i++)
{
printf("%d ", arr3[i]);
}
printf("\n");
//指定下表初始化
int arr4[10] = {[1]=10, [3]=30, [5]=50};//了解
n = sizeof(arr4)/sizeof(arr4[0]);
for (int i = 0; i < n; i++)
{
printf("%d ", arr4[i]);
}
printf("\n");
}
2、二维数组
定义方式
数据类型 数组名[行数][列数]; 例子: int a[3][4]; 创建了一个三行四列的二维数组 二维数组还是连续存储的
取数据:a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2]
a[1][3] …
二维数组的初始化
二维数组的初始化
void test03()
{
//分段初始化
int arr[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };
int row = sizeof(arr)/sizeof(arr[0]);
int col = sizeof(arr[0])/sizeof(arr[0][0]);
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
//连续初始化
int arr2[3][4]={1,2,3,4,5,6,7,8,9,10,11,12 };
row = sizeof(arr2)/sizeof(arr2[0]);
col = sizeof(arr2[0])/sizeof(arr2[0][0]);
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%d ", arr2[i][j]);
}
printf("\n");
}
//综合案例:
int arr3[3][4] = {{1,2},{3},{4,5}};
int arr4[3][4] = {1,2,3,4,5};
printf("%d\n",arr3[1][2]+arr4[1][2]);
}
3、字符数组
字符数组是元素的数据类型为字符类型的数组, 它既具有普通数组的一般性质,又具有某些特殊性质。 字符数组的初始化 逐个字符赋值
用字符串常量
void test04()
{
//需求:定义一个数组 32个元素 每个元素为char 这就是字符数组
//arr作为类型 代表的是数组的总大小
//数组名作为地址 代表的是 数组的首元素地址
char arr[32] = "";
//获取键盘输入 %s和scanf结合时候 遇到空格 回车 结束输入
printf("请输入一个字符串:");
scanf("%s", arr);
printf("arr=%s\n",arr);
//如果想获取带空格的字符串fgets
//fgets(存放的位置, 获取字符长度的上限, 从哪儿获取字符串);
char str[32]="";
fgets(str, sizeof(str), stdin);//stdin标准输入设备(键盘)
printf("str = ##%s##\n", str);
}
4、字符串函数
1 -- strlen
#include <string.h>
size_t strlen(const char *s);
功能:计算一个字符串的长度
参数:
s:保存字符串的首地址,一般为保存字符串的数组的首地址
返回值:
字符串的长度
注意:使用strlen获取字符串的长度,不包括\0
2 -- strcpy
#include <string.h>
char *strcpy(char *dest, const char *src);
功能:将src字符串复制到dest里面
参数:
dest:目的字符串
src:原字符串
返回值:
同dest
注意:将src的第一个\0也会复制给dest
必须保证strcpy的第一个参数对应的空间足够大,否则会内存溢出
3 -- strcat
#include <string.h>
char *strcat(char *dest, const char *src);
功能:将src追加到dest的后面
参数:
dest:目的字符串
src:原字符串
返回值:
同dest
注意:
strcat将src的数据(包括\0)追加到dest的后面,从dest'\0'的位置开始
注意:必须保证dest足够大,否则内存溢出
4 -- strcmp
#include <string.h>
int strcmp(const char *s1, const char *s2);
功能:比较两个字符串的内容是否一样
参数:
s1,s2:两个字符串
返回值:
=0 s1 = s2
>0 s1 > s2
<0 s1 < s2
注意:strcmp比较两个字符串,是一个字符一个字符比较,如果出现不一样的,
立即返回,根据对应ascii决定大小
比较到\0的时候就停止
int strncmp(const char *s1, const char *s2, size_t n);
功能:比较两个字符串的前n个字节是否一样