数组
1.一维数组的创建和初始化
2.一维数组的使用
3.一维数组在内存中的存储
4.二维数组的创建和初始化
5.二维数组的使用
6.二维数组在内存中的存储
7.数组作为函数参数
8.数组的应用实:三子棋 扫雷
一维数组的创建和初始化:
数组是批量创建一组相同类型(C语言里是这么要求)的变量.
type_t arr_name [const_n];
数组定义的时候,[]中的表达式也不一定非得是常量表达式.
在C89中要求必须是常量.在C99中允许使用变量表达式.
初始化 和 赋值 不一样.
在创建变量的同时设定值 这叫初始化.
变量已经创建完了,再去设定值,这叫赋值.
普通的数组只能使用{}初始化.字符数组处理使用{}还可以使用""的形式初始化,相当于在初始化一个字符串.
int main(){
int arr1[] = { 'a', 'b', 'c' };
int arr2[] = "abc";
printf("%d\n", sizeof(arr1));
printf("%d\n", sizeof(arr2));
system("pause");
return 0;
}
arr1 是3;arr2 是4
像arr1这个数组里面没有 \0 就不是一个字符串.不该对他使用strlen.如果强行使用,最终结果不可预期.这叫做未定义行为.
一维数组在内存中的存储
#include<stdio.h>
#include<stdlib.h>
int main(){
int arr[] = { 9, 5, 2, 7 };
for (int i = 0; i < 4; i++){
//%p专门用来打印地址(指针变量的)
// 按照十六进制的方式来打印的
printf("%p\n", &arr[i]);
}
system("pause");
return 0;
}
在内存中是连续的(C语言中是这样的);PHP核心类型就是数组,这里的数组下标不一定非得是整数.
前端:HTML+CSS+JS三剑客基本没变
上古时期 服务器C/C++ (CGI)有网站开发四件套LAMP:
Linux,Apache(HTTP服务器),MySQL,PHP
PHP不太适合开发复杂的大型项目,后来体量增长都被java/Python/ Goqudai
初创公司,优先考虑 Python,如果达到一定规模之后,Java或者 Go 进行重构.
如果达到一定的非常恐怖的规模,或者对性能要求极高的场景C++.
二维数组
本来就没有二维数组.所谓的二维数组,也是一个一维数组,只不过数组的每个元素,又是一个一维数组.
//长度为 3 的一堆数组,每个元素长度为 4.
int arr[3][4];
int main(){
//长度为 3 的一堆数组,每个元素长度为 4.
int arr[3][4] = {
//逗号表达式,值就是最后一个元素的值
//int a = (1, 2, 3);它的值就是 3
(1, 2),
(5, 6),
};
system("pause");
return 0;
}
把数组中的{}换成()之后输出的结果变成了{2, 6, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0}
我们发现1和5不见了,这是因为出现了逗号表达式.
逗号表达式在C语言中没有用,唯一的作用就是出现在笔试面试中.
Python中逗号表达式就挺有用,交换两个变量.
举例:C语言中交换两个变量
//交换两个变量
int a = 10;
int b = 20;
int tmp = a;
a = b;
b = tmp;
在Python,Go中可以直接这么写
a = 10;
b = 20;
a, b = b, a
无论是几维数组,定义的时候,永远只有第一个[]的数字可以省略,其他的都不能省略.
#include<stdio.h>
#include<stdlib.h>
int main(){
int arr[3][4] = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
};
for (int i = 0; i < 3; i++){
for (int j = 0; j < 4; j++){
printf(" %d", arr[i][j]);
}
printf("\n");
}
system("pause");
return 0;
}
想要给变量重命名:光标点亮 shift + alt+ r 就可以rename
以后用JetBraint 全家桶
Java:IDEA C++:CLion Python:PyCharm PHP:PHPStorm GO:GoLand 前端:WebStorm
二维数组在内存上依然是连续的.
数组作为函数参数:
#include<stdio.h>
#include<stdlib.h>
void Func(int arr[4]){
printf("%d\n", sizeof(arr) / sizeof(arr[0]));
}
int main(){
int arr[4] = { 9, 5, 2, 7 };
printf("%d\n", sizeof(arr) / sizeof(arr[0]));
Func(arr);
system("pause");
return 0;
}
还是前文中提过的C语言的 bug
数组如果作为函数参数,那就回隐式转成指针变量.(指向数组的首元素)
所以上面的数组输出结果为4和1.而不是4和4.
冒泡排序 重点掌握出场率极高;
快速排序 最常见(这两个就算背也要背下来)
#include<stdio.h>
#include<stdlib.h>
//数组的排序
//冒泡排序
void BubbleSort(int arr[],int size){
//以每次找最小为例
//[0,bound)已排序区间
//[bound, size)待排序区间
//每次找一个最小值放到前面去,也就意味着已排序区间就多一个元素
//待排序区间就少一个元素
for (int bound = 0; bound < size; bound++){
//还需要一重循环,这个循环就负责找到当前待排序区间中的最小值
//并放到 bound 位置上
for (int cur = size - 1; cur > bound; cur--){
//比较相邻元素.如果不符合升序规则就交换两个元素
if (arr[cur - 1] > arr[cur]){
int tmp = arr[cur - 1];
arr[cur - 1] = arr[cur];
arr[cur] = tmp;
}
}
}
}
int main(){
int arr[4] = { 9, 5, 2, 7 };
BubbleSort(arr, 4);
for (int i = 0; i < 4; i++){
printf("%d ", arr[i]);
}
printf("\n");
system("pause");
return 0;
}
数组的应用实例:三子棋
1.控制台程序,用户输入坐标的方式来落子
2.X表示玩家的棋子,O表示电脑的棋子
3.电脑随机落子
(1)表示棋盘(二维数组,char数组X表示玩家O表示电脑空格表示未落子)
初始情况下,二维数组应该全设为空格
(2)先打印一下棋盘(第一次打印的是空的棋盘)
(3)提示玩家先落子
(4)检查游戏是否结束
(5)电脑落子
(6)检查游戏是否结束
回到(2)继续执行
#include<stdio.h>
#include<stdlib.h>
int Menu(){
printf("=================\n");
printf("欢迎来到三子棋游戏\n");
printf("1.开始游戏\n");
printf("0.退出游戏\n");
printf("=================\n");
printf("请输入您的选择");
int choice = 0;
scanf("%d",&choice);
return choice;
}
#define MAX_ROW 3
#define MAX_COL 3
void Init(char chessBoard[MAX_ROW][MAX_COL]){
for (int row = 0; row < MAX_ROW;row++){
for (int col = 0; col < MAX_COL; col++){
chessBoard[row][col] = ' ';
}
}
}
void Game(){
//一局游戏的核心函数
//1.创建并初始化一个棋盘(字符类型的二维数组)
//尽量避免使用 magic number
//最好给这个数字起一个合适的名字
char chessBoard[MAX_ROW][MAX_ROW] = { 0 };
Init(chessBoard);
while (1){
//2.先打印棋盘
printf(chessBoard);
//3.提示玩家落子
playermove(chessBoard);
//4.检查游戏是否结束
if (Check(chessBoard)){
break;
}
//5.电脑进行落子
ComputerMove(chessBoard);
//6.检查游戏是否结束
if (Check(chessBoard)){
break;
}
//7.回到 2 继续执行
}
}
int main(){
while (1){
int choice = Menu();
if (choice == 1){
Game();
}
else if (choice == 0){
printf("goodbyd!\n");
break;
}
else{
printf("您的输入有误!\n");
}
}
system("pause");
return 0;
}