【比特鹏哥C语言_4.数组】

本文详细介绍了C语言中一维和二维数组的创建、初始化、使用及内存存储,强调了数组名作为首元素地址的特点。通过示例展示了数组在函数参数中的传递,并提供了三子棋游戏的实现思路。此外,还探讨了数组在扫雷游戏中的应用,包括棋盘初始化、雷的布置和排查等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本章重点

  1. 一维数组的创建和初始化
  2. 一维数组的使用
  3. 一维数组在内存中的存储
  4. 二维数组的创建和初始化
  5. 二维数组的使用
  6. 二维数组在内存中的存储
  7. 数组作为函数参数
  8. 数组的应用实例1:三子棋
  9. 数组的应用实例2:扫雷游戏

一、一维数组的创建和初始化

1.数组的创建

数组是一组相同类型元素的集合。数组的创建方式:

type_t arr_name [const_n]
//type_t 是指数组的元素类型
//const_n 是一个常量表达式(不能用变量),用来指定数组的大小
//(注意:数组的大小是指元素的个数,元素的个数要比下标大1)

注:C99语法支持变长数组(即数组的大小是变量),但VS2022不支持变长数组

2.数组的初始化

数组的初始化是指,在创建数组的同时给数组的内容一些初始值

int arr1[5]={
   1,2,3,4,5};//完全初始化
int arr2[5]={
   1};//不完全初始化
//下面两种初始化等价
int arr3[ ]={
   1,2,3};
int arr3[3]={
   1,2,3};
//字符数组初始化
char ch1[5]={
   'b','i','t'};//其实里面存放的是b i t \0 \0
char ch2[ ]={
   'b','i','t'};//里面存放的是b i t 

char ch3[5]="bit";//其实里面存放的是b i t \0 \0
char ch4[ ]="bit";//其实里面存放的是b i t \0 

数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。但是对于上面的单引号和双引号要区分内存中如何分配。

char ch2[ ]={
   'b','i','t'};//里面存放的是b i t 
char ch4[ ]="bit";//其实里面存放的是b i t \0 
printf("%s\n",ch2);
printf("%s\n",ch4);
//输出结果:
//bit乱码乱码乱码
//bit
//因为输出是遇到\0才会停止的,而数组ch2没有\0,所以会有乱码输出

二、 一维数组的使用

对于数组的使用我们之前介绍了一个操作符:[ ],下标引用操作符。它其实就数组访问的操作符。我们来看代码:

#include <stdio.h>
int main()
{
   
	int arr[10]={
   0};//注意这里是定义了10个元素
	arr[4]=5;//[ ] 是下标引用操作符。
	//注意,这里的[4]是第5个元素,下标是4,而初始化的[10]是10个元素
}
#include <stdio.h>
int main()
{
   
	int arr[10] = {
    0 };//数组的不完全初始化
	//计算元素个数
	int sz = sizeof(arr) / sizeof(arr[0]);
	//对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
	int i = 0;//做下标
	for (i = 0;i < 10;i++)
	{
   
		arr[i] = i;
	}
	//输出数组的内容
	for (i = 0;i < 10;i++)
	{
   
		printf("%d ", arr[i]);
	}
		return 0;
}

总结:

  1. 数组是使用下标来访问的,下标是从0开始。
  2. 数组的大小可以通过计算得到。
int arr[10] = {
    0 };
int sz = sizeof(arr) / sizeof(arr[0]);

三、 一维数组在内存中的存储

//%p - 是按地址的格式打印 - 十六进制的打印
//%x - 打印十六进制数
int main()
{
   
	//printf("%x\n", 284);//输出结果:11c
	//printf("%p\n", 284);//输出结果:0000011C(32位平台有8位,64位平台有16位)
	//解释为什么是8位:一个字节8比特位,也就是8个二进制位。四个二进制最大表示为15,就是一个16进制数,所以8位可以表示成2个16进制的数
	// 所以这么理解:一个字节表示8个二进制位,表示2个16进制位
	int arr[10] = {
    0 };
	int i = 0;
	for (i = 0;i < 10;i++)
	{
   
		printf("%p\n", &arr[i]);
	}
	return 0;
}

输出结果:
在这里插入图片描述

总结:

  1. 一维数组在内存中是连续存放的!
  2. 随着数组下标的增长,地址是由低到高变化的!
  3. 数组名是数组首元素的地址
int main()
{
   
	int arr[10] = {
    1,2,3,4,5,6,7,8,9,10};
	int* p = arr;//数组名是数组首元素的地址
	int i = 0;
	for (i = 0;i < 10;i++)
	{
   
		printf("%d ", *p);//一维数组在内存中是**连续存放**的
		p++;//所以每++一次,就能得到下一个元素的地址
	}
	return 0;
}
//输出结果:1 2 3 4 5 6 7 8 9 10

四、 二维数组的创建和初始化

1.二维数组的创建

//数组创建
int arr[3] [4];//3行4列,int类型
char arr[3] [4];//3行4列,char类型
double arr[2] [4];//2行4列,double类型

2.二维数组的初始化

//数组初始化-创建的同时给赋值
int arr[3] [4] = {
   1,2,3,4,5,6,7,8,9,10,11,12};
//内存中的存放情况是:
//1列 2列 3列 4列
//1行  1   2   3   4
//2行  5   6   7   8
//3行  9   10  11  12
int arr[3] [4] = {
   1,2,3,4,5,6,7};//不完全初始化,后面补0(char类型补\0)
//内存中的存放情况是:
//1列 2列 3列 4列
//1行  1   2   3   4
//2行  5   6   7   0
//3行  0   0   0   0
int arr[3] [4] = {
    {
   1,2}, {
   3,4}, {
   4,5} };
//内存中的存放情况是:
//1列 2列 3列 4列
//1行  1   2   0   0
//2行  3   4   0   0
//3行  4   5   0   0
int arr[ ] [4]= {
    {
   1,2}, {
   3,4}, {
   4,5} };//二维数组行可以省略,但是列不能省略
//内存中的存放情况是:
//0列 1列 2列 3列
//0行  1   2   0   0
//1行  3   4   0   0
//2行  4   5   0   0

3. 总结

  1. arr[3] [4],第一个[ ] 是行,第二个是列,行可以省略,列不可以省略
  2. 不完全初始化,后面补0
  3. 在创建的时候,[ ]里面的数字是规定几行几列,写几就是几;在使用的时候,是从0开始的

五、二维数组的使用

使用的时候,行号和列号都是从0开始的

int main()
{
   
	int arr[3][4] = {
    {
   1,2}, {
   3,4}, {
   4,5} };
	int i = 0, j = 0;
	for (i = 0;i < 3;i++)
	{
   
		for (j = 0;j < 4;j++)
		{
   
			printf("%d ",arr
### 关于 C语言 教程或视频讲解 根据已知的信息,可以确认有一位名为“”的教师专注于C语言的教学,并且其内容受到广泛好评。以下是关于如何获取的相关教程和资源的详细介绍: #### 的内容特点 以其深入浅出的方式教授复杂的编程概念而闻名。他的课程不仅涵盖了基础的概念,还针对一些较难理解的主题进行了详细的解析[^1]。例如,在讲解C语言指针时,他提出了五个核心概念帮助学习者更好地掌握这一难点。 #### 获取的C语言教程 如果希望找到由提供的C语言教程或者视频讲解,可以通过以下途径尝试: - **B站搜索**:通过搜索引擎输入关键词如“比特 C语言”,可以直接访问他在哔哩哔哩网站上的频道。该平台上有大量免费公开的高质量教学视频[^2]。 - **官方文档/讲义下载**:部分用户可能会分享基于课堂整理的学习笔记。这些资料通常会标明仅限个人学习交流使用并附带版权声明说明。 #### 示例代码片段展示 下面是一个简单的函数定义例子,展示了如何利用二维数组打印棋盘布局,这是可能在其课程中提到的一个实际应用案例之一[^3]: ```c void Displayboard(char board[ROWS][COLS], int row, int col) { int i, j; for (i = 0; i <= col; i++) { printf("%d ", i); } printf("\n"); for (i = 1; i <= row; i++) { printf("%d ", i); for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("\n"); } } ``` 此外,他还介绍了结构体的应用场景以及具体实现方式,这对于构建更复杂的数据模型非常有用[^4]: ```c struct Stu { char name[20]; // 姓名 int age; // 年龄 char sex[5]; // 性别 char id[15]; // 学号 }; ``` 以上两段代码分别体现了控制台图形化界面设计思路及自定义数据类型的创建过程,均属于高级话题范畴内的知识要点。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值