首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >收集飞花令碎片——C语言数组

收集飞花令碎片——C语言数组

作者头像
枫亭湖区
发布2025-11-13 09:07:25
发布2025-11-13 09:07:25
2030
举报

1.概念

数组是⼀组相同类型元素的集合

从这个概念中我们就可以发现2个有价值的信息: • 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。 • 数组中存放的多个数据,类型是相同的。 数组分为⼀维数组多维数组,多维数组一般多见的是二维数组

2.⼀维数组

创建与初始化

  • 数组的创建 ⼀维数组创建的基本语法如下:
代码语言:javascript
复制
type arr_name[常量值];

存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型。

type 指定的是数组中存放数据的类型,可以是: char、short、int、float 等,也可以自定义的类型。 • arr_name 指的是数组名的名字,这个名字根据实际情况,起的有意义就⾏。 • [] 中的常量值是⽤来指定数组的⼤⼩的,这个数组的⼤⼩是根据实际的需求指定就行。

比如:我们现在想存储某个班级的20⼈的数学成绩,那我们就可以创建⼀个数组,如下:

代码语言:javascript
复制
int math[20]; 

当然我们也可以根据需要创建其他类型和大小的数组:

代码语言:javascript
复制
char ch[8];
double score[10];
  • 数组的初始化
代码语言:javascript
复制
//完全初始化
int arr[5] = {1,2,3,4,5};
代码语言:javascript
复制
//不完全初始化
int arr2[6] = {1};//第⼀个元素初始化为1,剩余的元素默认初始化为0
代码语言:javascript
复制
//错误的初始化 - 初始化项太多
int arr3[3] = {1, 2, 3, 4};

数组的类型

数组类型 = 元素类型 + 维度信息

常见元素类型:

  • 基本类型:int, float, double, char 等
  • 派生类型:指针、结构体、联合等
  • 其他数组类型(多维数组)

数组的基本使用

  • 数组下标
在这里插入图片描述
在这里插入图片描述
  • 数组元素的打印 只要我们产生数组所有元素的下标就可以了,那我们使用for循环产⽣0~9的下标,接下来使用下标访问就行了。
代码语言:javascript
复制
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for(i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
  • 数组元素的输入
代码语言:javascript
复制
#include <stdio.h> 1
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for(i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
for(i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}

⼀维数组在内存中的存储

  • ⼀维数组在内存中的存储
代码语言:javascript
复制
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for(i = 0; i < 10; i++)
{
printf("&arr[%d] = %p\n ", i, &arr[i]);
}
return 0;
}
在这里插入图片描述
在这里插入图片描述

从输出的结果我们分析,数组随着下标的增⻓,地址是由⼩到⼤变化的,并且我们发现每两个相邻的元素之间相差4(因为⼀个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的。这就为后期我们使用指针访问数组奠定了基础(在讲指针的时候我们在再讲,这⾥暂且记住就行)。

sizeof 计算数组元素个数

在遍历数组的时候,我们经常想知道数组的元素个数,那C语⾔中有办法使⽤程序计算数组元素个数吗?

  • sizeof 中C语言是⼀个关键字,是可以计算类型或者变量大小的,其实 sizeof 也可以计算数组的大小
代码语言:javascript
复制
#include <stido.h>
int main()
{
int arr[10] = {0};
printf("%d\n", sizeof(arr));
return 0;
}

这里输出的结果是40,计算的是数组所占内存空间的总大小,单位是字节

  • 我们⼜知道数组中所有元素的类型都是相同的,那只要计算出⼀个元素所占字节的个数,数组的元素个数就能算出来。这⾥我们选择第⼀个元素算大小就可以。
代码语言:javascript
复制
#include <stido.h>
int main()
{
int arr[10] = {0};
printf("%d\n", sizeof(arr[0]));//计算⼀个元素的⼤⼩,单位是字节
return 0;
}
  • 接下来就能计算出数组的元素个数:
代码语言:javascript
复制
#include <stido.h>
int main()
{
int arr[10] = {0};
int sz = sizeof(arr)/sizeof(arr[0]);
printf("%d\n", sz);
return 0;
}

这里的结果是:10,表示数组有10个元素。

3.二维数组的创建与初始化

前⾯学习的数组被称为⼀维数组,数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称为多维数组

在这里插入图片描述
在这里插入图片描述

⼆维数组的创建

代码语言:javascript
复制
type arr_name[常量值1][常量值2];

例如:

代码语言:javascript
复制
int arr[3][5];
double data[2][8];

解释:上述代码中出现的信息 • 3表⽰数组有3行 • 5表⽰每一行有5个元素 • int 表⽰数组的每个元素是整型类型 • arr 是数组名,可以根据自己的需要指定名字 data数组意思基本⼀致。

⼆维数组的初始化

(1)不完全初始化
代码语言:javascript
复制
int arr1[3][5] = {1, 2};
int arr2[3][5] = {0};
在这里插入图片描述
在这里插入图片描述
(2)完全初始化
代码语言:javascript
复制
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
在这里插入图片描述
在这里插入图片描述
(3)按照行初始化
代码语言:javascript
复制
int arr4[3][5] = {{1,2},{3,4},{5,6}};
在这里插入图片描述
在这里插入图片描述
注意

初始化时省略行,但是不能省略列

二维数组的使用

  • ⼆维数组的下标

其实⼆维数组访问也是使用下标的形式的,⼆维数组是有行和列的,只要锁定了⾏和列就能唯⼀锁定数组中的⼀个元素。

C语言规定,⼆维数组的⾏是从0开始的,列也是从0开始的,如下所⽰:

代码语言:javascript
复制
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
在这里插入图片描述
在这里插入图片描述

二维数组的输入与输出

代码语言:javascript
复制
#include <stdio.h>
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
int i = 0;//遍历⾏
//输⼊
	for(i = 0; i < 3; i++) //产⽣⾏号
	{
	int j = 0;
		for(j = 0; j < 5; j++) //产⽣列号
		{
		scanf("%d", &arr[i][j]); //输⼊数据
		}
	}
	//输出
	for(i = 0; i < 3; i++) //产⽣⾏号
	{
	int j = 0;
		for(j = 0; j < 5; j++) //产⽣列号
		{
		printf("%d ", arr[i][j]); //输出数据
		}
	printf("\n");
	}
return 0;
}

⼆维数组在内存中的存储

  • ⼆维数组中的每个元素都是连续存放的,之间也是差4个字节
在这里插入图片描述
在这里插入图片描述

C99的变长数组

C99中给⼀个变长数组的新特性,允许我们可以使用变量指定数组大小。

  • 请看下面的代码:
代码语言:javascript
复制
int n = a + b;
int arr[n];

上⾯示例中,数组 arr 就是变⻓数组,因为它的⻓度取决于变量 n 的值,编译器没法事先确定,只有运⾏时才能知道 n 是多少。 变⻓数组的根本特征,就是数组⻓度只有运⾏时才能确定,所以变⻓数组不能初始化。它的好处是程序员不必在开发时,随意为数组指定⼀个估计的⻓度,程序可以在运⾏时为数组分配精确的⻓度。有⼀个⽐较迷惑的点,变⻓数组的意思是数组的大小是可以使用变量来指定的,在程序运⾏的时候,根据变量的⼤⼩来指定数组的元素个数,⽽不是说数组的大小是可变的。数组的大小⼀旦确定就不能再变化了。

遗憾的是在VS2022上,虽然⽀持⼤部分C99的语法,没有⽀持C99中的变⻓数组,没法测试

数组练习

练习1:多个字符从两端移动,向中间汇聚

C语言中,可以通过循环和控制字符移动来实现多个字符从两端向中间汇聚的效果。

在这里插入图片描述
在这里插入图片描述

如上图,通过代码让"**********************"变成arr1的字符串**

  • 代码展示
代码语言:javascript
复制
#include <stdio.h>  // 引入标准输入输出库(用于printf)
int main()
{
    char arr1[] = "welcome to bit...";  // 原始字符串(待显示的内容)
    char arr2[] = "#################";  // 初始掩码字符串(用#覆盖)
    int left = 0;                       // 左指针,初始指向第一个字符
    int right = strlen(arr1) - 1;         // 右指针,初始指向最后一个字符(strlen计算长度,-1因数组从0开始)

    printf("%s\n", arr2);               // 打印初始的掩码字符串(全#)

    while (left <= right)                  // 循环条件:左右指针未相遇
    {
        Sleep(1000);                    // 延迟1秒(Windows平台,需#include <windows.h>)
        arr2[left] = arr1[left];        // 将arr1左端字符赋给arr2左端
        arr2[right] = arr1[right];      // 将arr1右端字符赋给arr2右端
        left++;                         // 左指针右移
        right--;                        // 右指针左移
        printf("%s\n", arr2);           // 打印当前arr2的状态
    }
    return 0;
}

练习2:二分查找

题目:给定⼀个升序的整型数组,在这个数组中查找到指定的值n 找到了就打印n的下标, 找不到就打印:“找不到”。

  • 代码展示
代码语言:javascript
复制
#include <stdio.h>

int main()
{
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int left = 0;
    int right = sizeof(arr) / sizeof(arr[0]) - 1;
    int key = 7;    // 要找的数字
    int mid = 0;    // 记录中间元素的下标
    int find = 0;
    
    while (left <= right)
    {
        mid = (left + right) / 2;
        if (arr[mid] > key)
        {
            right = mid - 1;
        }
        else if (arr[mid] < key)
        {
            left = mid + 1;
        }
        else
        {
            find = 1;
            break;
        }
    }
    
    if (1 == find)
        printf("找到了,下标是%d\n", mid);
    else
        printf("找不到\n");
        
    return 0;
}

补充

数组越界访问,数组陷入死循环

在VS2022、X86、Debug 的环境下,编译器不做任何优化的话,下面代码的执行的结果是啥?

代码语言:javascript
复制
#include <stdio.h>
int main()
		{
		int i = 0;
		int arr[10] = {1,2,3,4,5,6,7,8,9,10};
			for(i = 0; i <= 12; i++)
				{
				arr[i] = 0;
				printf("hehe\n");
				}
		return 0;
		}
在这里插入图片描述
在这里插入图片描述

代码陷入死循环

如果你觉得这篇文章对你有帮助

请给个三连支持一下哦

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.概念
  • 2.⼀维数组
    • 创建与初始化
    • 数组的类型
    • 数组的基本使用
    • ⼀维数组在内存中的存储
    • sizeof 计算数组元素个数
  • 3.二维数组的创建与初始化
    • ⼆维数组的创建
    • ⼆维数组的初始化
      • (1)不完全初始化
      • (2)完全初始化
      • (3)按照行初始化
      • 注意
    • 二维数组的使用
    • 二维数组的输入与输出
    • ⼆维数组在内存中的存储
  • C99的变长数组
  • 数组练习
    • 练习1:多个字符从两端移动,向中间汇聚
    • 练习2:二分查找
  • 补充
  • 如果你觉得这篇文章对你有帮助
  • 请给个三连支持一下哦
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档