数组
定义
- 由一系列类型相同的的数据依次排列组成
- 组成数组的对象被称为数组的元素
声明
- 元素类型 数组名[元素数量]
- 元素数量不能是变量
类型
- 元素类型[元素数量]
初始化
- 元素类型 数组名[元素数量] = 初始化列表
int arr[3] = {1,2,3}
若初始化列表短于数组长度 则剩下元素被填0 若长于 则无法编译
元素数量可不填
只能初始化一次 但可多次赋值
不一定要初始化但之后需要赋值
赋值不可使用初始化列表
访问元素
- 数组名[下标]
- 下标从0开始
避免数组越界(下标大于等于元素数量)
eg 使用循环遍历数组元素
#include <stdio.h>
int main( {
int arr[5] = { 1, 2, 3, 4, 5 };
for (int i = 0; i < 5; i++)
printf("%d\n", arr[i]);
return 0;
}
修改元素
eg 修改数组第五个元素并打印
#include <stdio.h>
int main()
{
int arr[5] ={};//所有元素初始化为0
printf("%d\n", arr[4]);
arr[4] = 5;//将第五个元素赋值为5
printf("%d\n", arr[4]);/
return 0;
}
- 数组不可整体赋值但可以使用循环单个赋值或内存复制
使用for循环为单个元素赋值
#include <stdio.h>
int main()
{
int arr1[5] = { 1, 2, 3, 4, 5 };
int arr2[5] = {};
for (int i = 0; i < 5; i++)
{
arr2[i] = arr1[i];
printf("%d\n", arr2[i]);
}
return 0;
}
使用内存复制 memcpy 需包含头文件#include<memory.h>
#include <stdio.h>
#include<memory.h>
int main()
{
int arr1[5] = { 1, 2, 3, 4, 5 };
int arr2[5] = {};
memcpy(arr2, arr1, sizeof(arr2));
for (int i = 0; i < 5; i++)
printf("%d\n", arr2[i]);
return 0;
}
多维数组
其实就是套娃 把数组作为数组的元素
声明
- 元素类型 数组名[外层元素数量][内层元素数量]
int arr[5][10]//表示数组arr中有五个元素 每个元素都是有十个元素的数组
初始化
- 元素类型 数组名[元素数量] = 初始化列表
int arr[2][3] = {
{1, 2, 3},
{1, 2}
};
中间的花括号可省略 从而写成
int arr[2][3] = {
1, 2, 3,
1, 2
}
访问或修改元素
将原数组元素修改为原来二倍并访问
#include <stdio.h>
int main()
{
int arr[2][3] = {
1, 2, 3,
1, 2
};
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
arr[i][j] = arr[i][j] * 2;//修改二维数组值
printf("%d", arr[i][j]);//打印修改后的数组
}
printf("\n");
}
return 0;
}
更高维度数组
如三维数组把二维数组作为元素 访问需要三重循环
字符数组
\0为字符串/字符数组结尾标识 (\0也算字符)
字符串常量
- 每个字符占用一个字节 且末尾会附上\0指示字符串结尾 所以字符串常量大小等于字符数量加一
字符数组
- 元素数量不填时 末尾附上'\0'为结尾标识 字符数组大小等于字符数量加一
初始化
- char 数组名[元素数量] = 初始化列表
元素数量可不填
- 使用字符串常量 末尾自动添加'\0'为结尾标识
char str[20] = "helloworld"
等价于char str[20] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '\0'}- 使用初始化列表(字符数组) 且列表长度小于数组大小时 后面的元素会被初始化为'\0'
char str[20] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'}
等价于char str[20] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '\0'}
打印
- 可直接printf(str)
- 可使用转换规范%s(字符串占位符)
#include <stdio.h>
int main()
{
char str[20] = "helloword";
printf(str);//打印结果为helloworld
printf("\n");
printf("%s", str);//打印结果为helloworld
printf("\n");
return 0;
}
字符串结尾标记'\0'
- 字符串结尾必须有'\0' 字符数组可以没有'\0'
- 若初始化列表是字符串 则数组长度应不填或者大于字符数量
- 若初始化列表是字符 则最后一个字符应为'\0'且数组长度应不填或大于等于字符数量
- 初始化列表长度小于数组长度 后面的元素被填充为'\0' 字符串正常结尾
- 初始化列表长度等于数组长度 没有位置放'\0' 字符串无法结尾
- 初始化列表长度大于数组长度 无法通过编译
- 省略数组大小 如下
- 字符串常量
char str[] = "helloworld"
系统自动添加'\0' 所以字符串常量大小为11 正常结尾- 字符常量
char str[] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '\0'}
有11个字符常量 且最后一个为'\0' 正常结尾
char str[] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'}
有10个字符常量 且最后一个为'd' 无法结尾
测量字符数组中的字符串大小
使用循环
#include <stdio.h>
int main()
{
char str[20] = "helloworld";
int len = 0;
for (; str[len] != 0; len++)
{}
printf("%d", len);
return 0;
}
使用strlen
- 接受字符串作为参数 返回值为字符串长度
- 需包含头文件string.h
#include <stdio.h>
#include<string.h>
int main()
{
char str[20] = "helloworld";
int len1= strlen(str);//测量字符数组内字符串的长度
printf("%d\n", len1);
int len2= strlen("helloworld");//测量字符串常量的长度
printf("%d\n", len2);
printf("sizeof str %d\n", sizeof(str));//字符数组占用空间大小
printf("sizeof helloworld %d\n", sizeof("helloworld"));//字符串常量所占空间大小
return 0;
}
字符数组的修改
字符常量不能被修改 但字符数组可以被修改
char str1[10]="string"; 这样初始化是可以的
char str1[10]; str1="string"; 指针str1是不能存放字符串的,只能具体赋值如:str1[0]='s';
eg把小写变为大写(ASCII-32)
#include <stdio.h>
#include<string.h>
int main()
{
char str[20] = "helloworld";
//修改前
printf(str);
printf("\n");
//每个元素-32
for (int i = 0; i < strlen(str); i++)
str[i] = str[i] - 32;
//修改后
printf(str);
return 0;
}
getchar与putchar函数
- getchar输入单个字符
char c = getchar()
- putchar输出单个字符
putchar(c)
用putchar输出字符串helloword
#include <stdio.h>
#include<string.h>
int main()
{
char str[20] = "helloworld";
for (int i = 0; str[i] != '\0'; putchar(str[i++]))
{}
return 0;
}