数组
是指一组有相同数据类型的数据集合
-
一维数组
- 语法:类型说明符 数组名[整形表达式]{={初始化}};
int a[10]; // 定义一个数组,包含10个int类型元素的数组,数组名为a int b[10] = {1,2,3,4,5,6,7,8,9,0};- 类型说明符:数组元素的类型
- 数组名:数组名是个标识符,是一个常量,其值是数组的首个元素的地址
- 整形表达式:指定数组元素的个数(不建议使用变量定义,低版本gcc会报错)
- 初始化:
- 全部初始化:
int b[10] = {1,2,3,4,5,6,7,8,9,0}; - 部分初始化:只初始化前几位,其他数据为0
int b[10] = {1,2,3,4}; - 对不指定长度的数组,通过初始化赋值,来指定长度
int c[] = {1,2,3,4}; // 长度为4
- 全部初始化:
- 一维数组元素引用
一维数组在内存中存放的是在一个连续的地址
- 引用语法:数组名[下标]
- 下标就是元素在数组中的位置,应>=0, <=数组长度-1
int a[4] = {1,2,3,4}; int num = a[1]; a[2] = 10; // 数组赋值 - 引用语法:数组名[下标]
- 数组类型:
- int a[10]; // a就是 int[10] 类型
- 语法:类型说明符 数组名[整形表达式]{={初始化}};
-
多维数组
- 定义:数组名[表达式1][表达式2]
int b[2][4] = {1,2,3,4,5,6,7,8}; int b[2][4] = {{1,2,3,4}, {5,6,7,8}};- 二维数组,第一个下标是行,第二个下标是列
- 使用:b[0][2]
- 定义:数组名[表达式1][表达式2]
-
字符数组
- 定义:数组元素类型为char(字符型),可以是一维数组,也可以是二维数组(语法与上面类似)
- 与字符串的区别
- 单引号char,双引号字符串:字符串的长度比单字符多一个\0结尾
char c1[] = {'c', 'h', 'i', 'n', 'a'}; char c2[] = {"china"}; typeof(c1) == typeof(c2) ??? c2[0] == 'c' c1[0] == 'c' c2[1] == 'h' c1[1] == 'h' c2[2] == 'i' c1[2] == 'i' c2[3] == 'n' c1[3] == 'n' c2[4] == 'a' c1[4] == 'a' c2[5] == '\0'
- 字符的多维数组就是字符串的数组
char[][10] = {'123456789', 'abcdefghi'};#include <stdio.h> int main() { char c1[][10] = {"12345679", "abcdefghi"}; printf("c1[0]:%s\n", c1[0]); printf("c1[1]:%s\n", c1[1]); return 0; } - 字符数组操作:
- 字符串赋值,可以scanf一次全部赋值,其他数据格式不行
- 代码:
#include <stdio.h> int main() { char str[20] = {0}; scanf("%s", str); int i = 0; while(1){ char c = str[i]; if (c>='0' && c<= '9') { printf("%c", c); } // if (c == 0){ // break; // } i++; } printf("\n"); return 0; } // 执行后输入输出为: 23255kk39f 2325539000这里scanf直接赋值字符串。
关于输出结果的结尾000, 是因为while没有设置break条件,数据会一直往后面读,直到超出字符串内存,读取到字符串内存之外的数据,导致程序崩溃了。000就表示刚好超出的内存无数据#include <stdio.h> int main() { char str[20] = {0}; scanf("%s", str); int i = 0; while(1){ char c = str[i]; if (c>='0' && c<= '9') { printf("%c", c); } // if (c == 0){ // break; // } i++; } printf("\n"); return 0; } // 执行后输入输出为: 23255kk39f 2325539这里判断 c == 0 作为判断条件,是因为字符串的结尾是 \0,字符正好==0时表示到了字符串结尾。之所以能让char与整数比较,是因为char的本质就是一个小的整数类型(1字节)而\0对应的ascii码就是0.所以能用==
代码练习
- 写一个计算器,实现输入多个数字进行加减计算
#include <stdio.h>
int main(){
int numbers[10] = {0};
char operators[10] = {0};
while(1){
int type = 0; // type=0表示输入数字,=1表示输入运算符
int pos = 0; // 标记输入了多少位
printf("请输入数字与运算符(并以=和enter结尾):");
while(1){
if (type == 0){
// 这里接收数字,如果一次输入很长一段文字,就会截取到第一个数字结束:
// 如输入:1+2+3-4=;就会截取到1
scanf("%d", &numbers[pos]);
} else {
// %c只读取一个字符,其他的输入会进入下一次循环
// (%s是接收一个字符串,%c接收一个字符,%d接整数)
scanf("%c", &operators[pos]);
// 这里判断只接收+-= 这三种符号
if (operators[pos]!='+' && operators[pos]!='-' && operators[pos]!='=') continue;
// 这里判断出一个跳出while的条件,为=时表示本次输入结束,要开始计算了
if (operators[pos] == '=') break;
pos++;
}
type = !type;
}
// 累加计算
int result = numbers[0];
for (int i=0; i<=pos; i++){
switch(operators[i]){
// 这里只支持+- 计算
case '+':
// 这里使用i+1是因为数字总是比运算符多一位,第一位已经赋值给result了。
result += numbers[i+1];
break;
case '-':
result -= numbers[i+1];
break;
}
}
printf("result:%d\n", result);
}
return 0;
}
运行结果:
PS C:\Users\86176\Desktop\嵌入式\c语言\ccode\class3> .\str.exe
请输入数字与运算符(并以=和enter结尾):1+2+3+4=
result:10
请输入数字与运算符(并以=和enter结尾):1+2+3+4-5=
result:5
请输入数字与运算符(并以=和enter结尾):1+2+3+ x4=
result:10
请输入数字与运算符(并以=和enter结尾):