一、数组
什么是数组:
数组就是变量的组合,是一种批量定义变量的方式
如何定义数组:
类型名 数组名[数量];
int arr[8];// 相当于定义了8个int类型的变量
int a1, a2, a3,...;
访问数组中的变量:
数组名[下标];
下标从0开始,范围0~数量-1
遍历数组:
与for循环配合,使用循环变量作为数组遍历的下标
int arr[10];
for (int i = 0; i < 10; ++i) {
printf("%d%c",arr[i], " \n"[i == 9]);
}
数组的初始化:
数组的元素的默认值也是随机的,如果想要对数组初始化可以使用以下语法:
类型名 数组名[数量] = {v1,v2,v3,...};
1、如果初始化数据过多,编译器会产生警告并丢弃
2、如果初始化数据不足,编译器会自动补0
3、对数组初始化时,数组的初始值可以省略,大括号不能省略,编译器会自动全部补0
4、当使用初始化语法时,数组的数量可以省略,编译器会计算出大括号中数据的个数,然后确定数组的数量
5、初始化语法只能在定义数组时使用,这也是唯一一次能对数组批量访问的机会,后序只能单个元素访问
练习2:输入一个整数,分解显示
例如:输入12321 输出 1 2 3 2 1
输入-12321 输出 - 1 2 3 2 1
int num = 0,cnt = 0;
printf("请输入一个整数:");
scanf("%d",&num);
char arr[10] = {};
if(num < 0) {
printf("- ");
num = -num; // num = abs(num);
}
while (num) {
arr[cnt++] = num % 10;
num /= 10;
}
for (int i = cnt - 1; i >= 0; --i) {
printf("%hhd ",arr[i]);
}
练习3:输入一个正整数,计算出每个数字出现的次数
123545
arr[10] = {}
arr[5]++
数组与sizeof
int arr[10] = {};
sizeof(数组名) 计算整个数组的总字节数
sizeof(arr)
sizeof(数组名[下标])
sizeof(arr[0]) 计算某个元素的字节数
万能公式:
sizeof(arr)/sizeof(arr[0]) 计算数组的元素个数
数组越界:
使用非法的下标访问该下标的数组元素,该动作称为数组越界
int arr[10];
arr[10] = 10;
C语言中当数组越界访问时,编译器不会报错,因为C编译器是不检查数组下标是否合法的,因为这样可以提高代码的编译速度、运行速度
数据越界的后果:(面试题)
1、运气好,一切正常
2、段错误,操作系统发现程序非法访问内存,主动杀死程序
3、脏数据,数据越界访问到了其它程序、数组、变量的数据,破坏了别人的数据
二、二维数组
什么是二维数组:
普通一维数组,可以看做若干个变量排成一排
二维数组,可以把若干个类型相同的变量排成一个方阵
定义二维数组:
类型名 数组名[行数][列数];
int arr[3][5];
[][][][][]
[][][][][]
[][][][][]
访问二维数组元素:
数组名[行下标][列下标];
行下标:0 ~ 行数-1
列下标:0 ~ 列数-1
int arr[3][5];
[0][0] [0][1] [0][2] [0][3] [0][4]
[1][0] [1][1] [1][2] [1][3] [1][4]
[2][0] [2][1] [2][2] [2][3] [2][4]
二维数组的遍历:
一般与双层for循环配合,一般外层循环遍历行,内层循环遍历列
int arr[3][5];
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 5; ++j) {
printf("%d%c", arr[i][j], " \n"[j == 4]);
}
}
二维数组的初始化:
二维数组在初始化时,其它特点与一维数组基本相同
注意:二维数组初始化时,可以省略行数,但是一定不能省略列数,并且要提供初始化数据才可以省略行数,编译器会自动计算元素个数
类型名 数组名[行数][列数] = {{第一行},{第二行},...};
int arr[][5] = {1,2,3,4}; true
int arr[1][] = {1,2,3,4}; false
三、变长数组
定长数组:
使用常量作为定义数组的长度参数,或者使用初始化数据定义数组时省略长度参数,这些数组都称为定长数组,由编译器最终确定数组的长度
变长数组:
使用变量作为定义数组的长度参数时,称为变长数组,当程序运行时,执行定义数组的语句前,可以改变数组的长度变量,所以数组的长度可以每一次运行都不同,但是一旦数组的长度确定后,都无法改变
int len;
scanf("%d", &len);
int arr[len];
变长数组的优缺点:
优点:可以根据运行的实际需求定义数组的长度,从而节约内存空间
缺点:变长数组不能初始化,对数组的初始化是发生在编译器编译期间,而变长数组的长度是运行到定义语句后才能确定,因此编译器在编译期间无法得知变长数组的长度,因此无法初始化
如何在Ubuntu系统下获取方向键 :
1、下载 getch.h 头文件并移动到共享文件夹目录下
2、在Ubuntu系统下,在共享文件夹目录下右键-打开终端,执行以下命令
sudo cp getch.h /usr/include/
sudo chmod 644 /usr/include/getch.h
3、测试方向键的键值
int main() {
for(;;) {
int cmd = getch(); // 获取按下的按键的键值
printf("%d\n",cmd);
if(183 == cmd) {
// 按上的操作
}
}
}
// 上183 下184 左186 右185
项目:走迷宫
#include <stdio.h>
#include <getch.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>
int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, 1, -1};
char g[][10] = {
"##########",
"###.###...",
"#...###.##",
"###.#.#.##",
"###.#.#.##",
"#..@..#.##",
"#.#.#...##",
"#.#.#.#.##",
"#.###.#.##",
"##########",
};
void print() {
system("clear");
for (int i = 0; i < 10; ++i) {
for (int j = 0; j < 10; ++j) {
printf("%c", g[i][j]);
}
puts("");
}
}
int main() {
print();
int times = time(0);
int sx = 6, sy = 4;
while (true) {
int sx = -1, sy = -1;
for (int i = 0; i < 10; ++i) {
for (int j = 0; j < 10; ++j) if (g[i][j] == '@') {
sx = i, sy = j;
}
}
int get = getch() - 183;
int fx = dx[get] + sx, fy = dy[get] + sy;
if (fx < 0 || fy < 0 || fx >= 10 || fy >= 10) {
print();
printf("times: %d", (int)time(0) - times);
break;
} else if (g[fx][fy] == '.') {
g[fx][fy] ^= g[sx][sy] ^= g[fx][fy] ^= g[sx][sy];
}
print();
}
}
附:getch.h文件内容
#ifndef GETCH_H
#define GETCH_H
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
// 修改终端的控制方式,1取消回显、确认 2获取数据 3还原
static int getch(void)
{
// 记录终端的配置信息
struct termios old;
// 获取终端的配置信息
tcgetattr(STDIN_FILENO,&old);
// 设置新的终端配置
struct termios new_1 = old;
// 取消确认、回显
new_1.c_lflag &= ~(ICANON|ECHO);
// 设置终端配置信息
tcsetattr(STDIN_FILENO,TCSANOW,&new_1);
// 在新模式下获取数据
int key_val = 0;
do{
key_val += getchar();
}while(stdin->_IO_read_end - stdin->_IO_read_ptr);
// 还原配置信息
tcsetattr(STDIN_FILENO,TCSANOW,&old);
return key_val;
}
#endif//GETCH_H
标签:10,arr,初始化,int,C语言,标准,编译器,数组
From: https://www.cnblogs.com/sleeeeeping/p/18173571