c语言学习第十一课——数组与三子棋游戏实现

简介: c语言学习第十一课——数组与三子棋游戏实现

1.一维数组的创建与初始化

1.1数组的创建

数组是一组相同类型数据的集合

tydef_t    arrname  [const_t]

c99标准前,数组的大小必须是常量表的式

c99标准中,引入变长数组的概念,及数组大小是可以用变量表示的。变长数组无法初始化。

int main()
{
  int arr[8];
  char ch[10];
  float arr2[15];
  return 0;
}

举例创建如上数组,创建格式为 类型+数组名+[数组大小]

1.2 数组的初始化

数组的初始化是指,在创建数组的同时给数组的内容进行赋值

int main()
{
  int arr[8] = { 1,2,3,4,5,6,7,8 };
  char ch[10] = { 'd','s','df','f','c','h','g' };
  float arr2[15] = { 1.23,5.65,7.32,5.62,9.35 };
  char arr3[] = "faoijfaj";//可以不指定大小,大小会根据初始化内容决定
  return 0;
}

初始化可以完全初始化,也可以不完全初始化,剩余的默认初始化为0,但绝不可以初始化超过数组大小。

这里须注意一下字符数组两种初始化的区别

char arr[]="fafafa".char arr2={'f','a','f','a','f','a'}  前者有结束标志“\0”,后者没有。

1.3一维数组的使用

利用下标引用操作符引用数组

int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9 };
  for (int i = 0; i < 10; i++)
  {
        printf("%d", arr[9]);
  }
  int size = sizeof(arr) / szieof(arr[0]);//计算数组元素个数
  return 0;
}

1.4一维数组的存储

因为数组的地址是连续存放的,我们在应用数组的地址时,当存放给一个指针时,该指针也可通过首地址找出后面元素的地址

所以在某种程度,指针可以表示数组,数组名代表一个指针。

我们先看看的地址

int main()
{
  int arr[10] = { 0 };
  int i = 0;
  int se = sizoef(arr) / sizeof(arr[0]);
  for (i = 0; i < se; i++)
  {
    printf("%p\n", &arr[i]);
  }
  return 0;
  //这里一个整型元素 4个字节,总大小为40字节。
  //打印出每个元素的地址 我们发现两两地址刚好差 4,即元素在数组中是连续存储的。
  //随着下标的递增,地址由低到高变化。
}

958a015ce1324db690300400eb9a16fd.png


再看看利用和指针实现数组元素的访问。

int main()
{
  int arr[10] = { 0 };
  int i = 0;
  int se = sizoef(arr) / sizeof(arr[0]);
  int* p = &arr[0];//int *p=arr;
  for (i = 0; i < se; i++)
  {
    printf("%p\n", p + i);
  }
  for (i = 0; i < se; i++)
  {
    printf("%d\n", *(p + i));//打印1到10
  }
  return 0;
}

2.二维数组

2.1二维数组的创建

类比于一维数组创建,这里直接创建二维数组。

//数组创建
int arr[3][4];
char arr[3][5];
double arr[2][4];

在理解二维数组上,因为它1是二维,则我们理解为他是几行几列的数据存储,前一个代表行,后一个代表列,如同行列式里的方阵。

2.2二维数组的初始化

int main()
{
  int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//直接初始化
  char arr[5][6] = { {1,2},{3,4},{5,6} };//一行行的初始化,且不完全初始化
  //在这里初始化时,不同于一维数组可以省略数组大小,在二维数组中,行可以省略,
    //但列不能省略,
  //省略行,不省略列,计算机还是可以通过计算确定
    //数组的存储方式,但若省略了列,只有行,此时二维数组的存储情况较多,计算机无法判断。
  int arr[][4] = { {1,2},{3,4},{5,6} };
  return 0;
}

这里我们举例  int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//直接初始化

我们可以这样来理解它

786a9c0bff0448a4bbcfbd0fb18a57f5.png

2.3二维数组的使用

仍然通过下标来引用数组,且行列编号都是从0开始

int main()
{
  int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
  //1  2  3  4
  //5  6  7  8
  //9 10 11 12
  printf("%d", arr[1][2]);//打印7
  for (int i = 0; i < 3; i++)
  {
    for (int j = 0; j < 4; j++)
    {
      printf("%2d", arr[i][j]);//右对齐2位打印整数 
    }
    printf("\n");
  }
  //打印数组的每一个元素
  //先行遍历,在列遍历,
  return 0;
}

2.4二维数组在内存中的存储

还是观察地址

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("%p\n", &arr[i][j]);
    }
  }
  return 0;
}


d54084391eae4327b4e21073baefed2c.png

我们发现元素的地址还是连续的,故我们理解的是几行几列,但实际二维数组元素的地址是连续的。

与一维数组一样,我们知道了首地址,传给一个指针时,我们可以通过首地址间接访问二维数组的所有成员。

此时我们还可以这样理解二维数组:

我们将二维数组的每一行看做一个一维数组,则arr[0]就是第一行的数组名,arr[1]是第二行的数组名

......,相当于int arr[0]  [4],int arr[1]  [4],int arr[2]  [4],int arr[3]  [4]。

3.数组的越界

在数组下标访问的过程中,若访问超出数组大小范围,下标越界访问,编译器不一定会报错,但该代码已经是错误了。

4.数组作为函数参数

这里我们用冒泡排序来举例,数组做函数参数:

void bubble_sort(int arr[])//参数本质是一个指针  int * arr
{
  for (int i = 0; i < 10 - 1; i++)
  {
    for (int j = 0; j < 10 - i - j; j++)
    {
      if (arr[j] > arr[j+1])
      {
        int tmp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = tmp;
      }
    }
  }
}
int main()
{
  int arr[] = { 4,6,8,2,8,6,9,5 };
  //排序
  bubble_sort(arr);
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    printf("%d", arr[i]);
  }
  return 0;
}

我们发现在用数组传参时,本质上就是传的数组首元素的地址,所以在传参时,我们仍可以用对应类型的指针作为参数,来接收数组。

根据二维数组的特点,我们可以实现一个三子棋游戏。

具体如下:三子棋 - 代码片段 - Gitee.com

相关文章
|
23天前
|
存储 编译器 C语言
【C语言基础考研向】09 一维数组
数组是一种有序集合,用于存储相同类型的数据,便于统一操作与管理。例如,将衣柜底层划分为10个格子存放鞋子,便于快速定位。在C语言中,数组定义格式为 `类型说明符数组名[常量表达式];`,如 `int a[10];` 表示定义了一个包含10个整数的数组。数组初始化时可以直接赋值,也可以部分赋值,且数组长度必须固定。数组在内存中连续存储,访问时需注意下标范围,避免越界导致数据异常。数组作为参数传递时,传递的是首地址,修改会影响原数组。
|
23天前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
26天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第六章 数组_一维数组_二维数组_字符数组详解
本章介绍了C语言中的数组概念及应用。数组是一种存储同一类型数据的线性结构,通过下标访问元素。一维数组定义需指定长度,如`int a[10]`,并遵循命名规则。数组元素初始化可使用 `{}`,多余初值补0,少则随机。二维数组扩展了维度,定义形式为`int a[3][4]`,按行优先顺序存储。字符数组用于存储字符串,初始化时需添加结束符`\0`。此外,介绍了字符串处理函数,如`strcat()`、`strcpy()`、`strcmp()` 和 `strlen()`,用于拼接、复制、比较和计算字符串长度。
|
2月前
|
算法 C语言
C语言------数组
这篇文章是关于C语言数组的实训,包括一维数组、二维数组和字符数组的定义、赋值、输入、输出方法,并通过实例代码演示了数组的使用和一些基本算法,如冒泡排序。
C语言------数组
|
2月前
|
存储 编译器 数据处理
【编程秘籍】解锁C语言数组的奥秘:从零开始,深入浅出,带你领略数组的魅力与实战技巧!
【8月更文挑战第22天】数组是C语言中存储同类型元素的基本结构。本文从定义出发,详述数组声明、初始化与访问。示例展示如何声明如`int numbers[5];`的数组,并通过下标访问元素。初始化可在声明时进行,如`int numbers[] = {1,2,3,4,5};`,编译器自动计算大小。初始化时未指定的元素默认为0。通过循环可遍历数组,数组名视为指向首元素的指针,方便传递给函数。多维数组表示矩阵,如`int matrix[3][4];`。动态数组利用`malloc()`分配内存,需用`free()`释放以避免内存泄漏。掌握这些技巧是高效数据处理的基础。
56 2
|
2月前
|
算法 编译器 C语言
【C语言篇】猜数字游戏(赋源码)
rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是依赖编译器上实现的,但是⼤部分编译器上是32767。
|
2月前
|
存储 算法 搜索推荐
C语言中数组
C语言中数组
36 0
|
2月前
|
存储 编译器 程序员
【C语言篇】从零带你全面了解数组(超详细)
有时候,数组在创建的时候,我们需要给定⼀些初始值,这种就称为初始化。
|
算法 编译器 程序员
C语言学习笔记—P11(数组<2>+图解+题例+三子棋游戏<初级>)
C语言学习笔记(数组<2>+图解+题例+三子棋游戏<初级>)
126 0
C语言学习笔记—P11(数组<2>+图解+题例+三子棋游戏<初级>)
|
存储 C语言
C语言学习笔记—P10(数组<1>+图解+题例)
C语言学习笔记(数组<1>+图解+题例)
128 0
C语言学习笔记—P10(数组<1>+图解+题例)
下一篇
无影云桌面