初始C语言——详细地讲解数组的内容以及易错点

这篇具有很好参考价值的文章主要介绍了初始C语言——详细地讲解数组的内容以及易错点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


目录

系列文章目录

前言

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

1.1 数组的创建

1.2 数组的初始化

1.3 一维数组的使用

 1.4 一维数组在内存中的存储

二、二维数组的创建与初始化 

2.1 二维数组的创建

2.2 二维数组的初始化

2.3 二维数组的使用 

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

三、数组越界

 四、数组作为函数参数

4.1 冒泡排序函数的错误设计 

4.2 数组名是什么? 

4.3 冒泡排序函数的正确设计 

总结


前言

       在上一章中,我们已经详细地介绍了有关函数的相关内容,学习了函数是什么、C语言中函数的分类、函数的参数、调用、函数的嵌套调用和链式访问、函数的声明和定义、函数递归。

       而在这一章,小编将带领大家进行数组的学习,虽然数组的知识点比较小,但是我们还是要进行好好学习,从标题中,我们能看出要详细地学习数组的知识,希望大家看的开心!


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

       小编在之前就比较迷数组,第一就是数组的下标是从0开始的,但是不要害怕,紧跟小编的步伐,来进行学习吧!

1.1 数组的创建

       数组是一组相同类型元素的集合,一定要记住,因为后面我们要学习结构体,结构体可以存放不同类型元素的集合。   

数组的创建方式:

type_t arr_name [const_n]

type_t    是指数组的元素类型

const_n 是一个常量表达式,用来指定数组的大小

       在了解完数组的创建方式后,下面我们来进行数组创建的实例:

//代码1
int arrq[10];

//代码2
int count = 10;
int arr2[count];  //数组这样可以正常创建吗?

//代码3
char arr3[10];
float arr4[10];
double arr5[10];

       代码2这种情况在C语言(C99之前)中是不能使用的,因为数组创建在C99标准之前,[ ]中要给一个常量才可以,不能使用变量。在C99标准支持了变长数组的概念,数组的大小是可以使用变量指定的,但一定要切记变长数组是不能初始化的。

1.2 数组的初始化

为啥要讲数组的初始化呢?

       因为局部变量不初始化的话,局部变量里放的是随机值;全局变量不初始化的话,全局变量里放的是0所以说初始化很重要。

数组初始化是指在创建数组的同时给数组的内容一些合理初始值(初始化)

数组的初始化分为完全初始化非完全初始化

 看代码:

    int arr1[10] = { 1,2,3 };        //不完全初始化
	int arr2[] = { 1,2,3,4 };        //不完全初始化
	int arr3[5] = { 1,2,3,4,5 };     //完全初始化
	char arr4[3] = { 'a', 98, 'c' }; //完全初始化
	char arr5[] = { 'a', 'b', 'c' }; //不完全初始化
	char arr6[] = "abcdef";          //不完全初始化

       数组的完全初始化是指:数组创建时在给定数字时将数组填满;而数组的非完全初始化是指:数组创建时在给定数字时填不满数组,则剩下的元素默认初始化为0;下面,我们来进行调试验证。

初始C语言——详细地讲解数组的内容以及易错点,初阶C语言,c语言,开发语言

       数组在创建的时候如果想不指定数组的确定大小就得初始化数组的元素个数根据初始化的内容来确定。

1.3 一维数组的使用

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

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };//数组的不完全初始化
    //计算数组的元素个数
	int sz = sizeof(arr) / sizeof(arr[0]);
    //对数组内容赋值,数组是使用下标来访问的,下标从0开始,所以:
	int i = 0; //做下标
	for (i = 0; i < sz; i++)
	{
		arr[i] = i;
	}
    //输出内容数据
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

       在这里,小编我要提醒大家:要记住数组的长度怎样计算?但有一种情况大家不要使用这种方法进行计算(代码在下面)这种方式会在sizeof(arr)算的是整个数组的长度,而不是光输入的数组长度,其余情况倒是可以随便用。

const int N = 10;
int arr[100];
for(int i = 0; i < N; i++)
{
    ...
}
int sz = sizeof(arr)/sizeof(arr[0]);

总结:

1)数组是使用下标来访问的,下标是从0开始的,依次增加1

2)数组的大小可以通过计算得到的。

 1.4 一维数组在内存中的存储

       当讨论完一维数组的使用后,接下来我们来讨论数组在内存中的存储。 下面,我们来看一下代码吧!(在这里提一嘴,打印地址的占位符是:%p;为了便于观察,我们将环境改为X86。)

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		arr[i] = i;
	}
	for (i = 0; i < sz; i++)
	{
		printf("&arr[%d] = %p\n", i, &arr[i]);
	}
	printf("\n");
	return 0;
}

 输出的结果如下:

初始C语言——详细地讲解数组的内容以及易错点,初阶C语言,c语言,开发语言

       仔细观察输出的结果,我们知道,随着数组下标的增长,元素的地址也是有规律的递增。由此可以得出结论:数组在内存中是连续存放的。(方便内存区使用数组)

初始C语言——详细地讲解数组的内容以及易错点,初阶C语言,c语言,开发语言


二、二维数组的创建与初始化 


2.1 二维数组的创建

       在小编看来,二维数组与一维数组的不同在于:二维数组增加了行和列的关系接下来,看二维数组的创建。

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

2.2 二维数组的初始化

小编记得二维数组的初始化要比一维数组的初始化要难,下面也有好几种情况:

int arr1[3][4] = { 1,2,3,4 };
int arr2[3][4] = { {1,2},{3,4} };//如果二维数组没有放满,则补0
int arr3[][4] = { {1,2},{5,4} };//二维数组如果有初始化,行可以省略,列不能省略

下面在监视窗口中可以验证上述所说:

初始C语言——详细地讲解数组的内容以及易错点,初阶C语言,c语言,开发语言  

为什么在二维数组初始化中可以有大括号呢?

我们可以将二维数组的每一行想像为一个一维数组

2.3 二维数组的使用 

       二维数组的使用也是通过下标的方式在假想中,二维数组是一个矩阵,所以二维数组有自己的行号和列号,我们可以通过行号和列号进行使用一个元素,就如同坐标系一样去访问。下面举个例子:

int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};

初始C语言——详细地讲解数组的内容以及易错点,初阶C语言,c语言,开发语言

 下面看代码:

int main()
{
	int arr[3][5] = { 0 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			arr[i][j] = i * 4 + 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;
}

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

       在经历了上面对二维数组的学习后,大家可能会发现其实二维数组与一维数组基本类似。像一维数组一样,这里我们尝试打印二维数组的每一个元素地址。下面,我们来看一下代码吧!(在这里再提一嘴,打印地址的占位符是:%p;为了便于观察,我们将环境改为X86。)

int main()
{
	int arr[3][5] = { 0 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			arr[i][j] = i * 4 + j;
		}
	}
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

 输出的结果如下:

初始C语言——详细地讲解数组的内容以及易错点,初阶C语言,c语言,开发语言

       通过结果我们可以分析得到,其实二维数组在内存中也是连续存储的,这里能看出二维数组是一维数组的数组,证实了这一点。

初始C语言——详细地讲解数组的内容以及易错点,初阶C语言,c语言,开发语言


三、数组越界


       数组的下标是有范围限制的;数组的下标规定是从0开始的,如果数组有N个元素,最后一个元素的下标就是N-1。所以数组的下标如果小于0,或者大于N-1,就是数组越界访问了,超出了数组合法空间的访问。二维数组的行和列也可能存在越界。

       C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的。 

初始C语言——详细地讲解数组的内容以及易错点,初阶C语言,c语言,开发语言

但如果有赋值操作的话,程序就会崩溃。

初始C语言——详细地讲解数组的内容以及易错点,初阶C语言,c语言,开发语言所以程序员写代码时,最好自己做好越界的检查。 


四、数组作为函数参数


       往往我们写代码的时候,会将数组作为参数传入函数,接下来我们借着举例子的时候,为大家介绍一下排序算法中最简单的排序——冒泡排序。

冒泡排序的算法思想:两两相邻的元素进行比较,将较大(较小)的沉入最下面。

4.1 冒泡排序函数的错误设计 

我们接下来看代码:

void bubble_sort(int arr[])
{
    int sz = sizeof(arr) / sizeof(arr[0]);
    for (int i = sz - 1; i >= 0; i++)
    {
        for (int j = 0; j < i; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}
int main()
{
    int arr[] = { 3,5,7,8,0,2,1,4,6,9 };
    bubble_sort(arr);
    for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

       这个代码出现问题,那我们来找一下问题:经过调试之后,可以看到bubble_sort函数内部的sz为2,而不是我们想要的值。难道数组作为函数参数的时候,不是把整个数组传递过去吗?

初始C语言——详细地讲解数组的内容以及易错点,初阶C语言,c语言,开发语言

4.2 数组名是什么? 

为了解决上述问题,我们进行探究数组名的内容:看下面的代码:

初始C语言——详细地讲解数组的内容以及易错点,初阶C语言,c语言,开发语言

结论:数组名就是地址。通常来说,数组名是数组首元素的地址。 

        如果数组名是首元素地址的话,那么我们之前学过计算数组的长度和这个情况不同。看代码:

初始C语言——详细地讲解数组的内容以及易错点,初阶C语言,c语言,开发语言

所以数组名表示的并不一定都是首元素地址,有两个例外: 

  1. sizeof(数组名)计算整个数组的大小,sizeof内部单独放入一个数组名,数组名表示整个数组,单位是字节。
  2. &数组名取出的是数组的地址。&数组名。数组名表示整个数组

4.3 冒泡排序函数的正确设计 

       当数组传参的时候,实际上只是把数组的首元素的地址传递过去了。所以即使在函数参数部分写成数组的形式:int arr[ ] 表示的依然是一个指针: int* arr。那么这也回答了4.1中的问题:sizeof(arr)的结果是8。

 那我们该怎么进行更改函数设计呢?下面看代码:

void bubble_sort(int arr[], int sz)//参数接受元素个数
{
    //代码同上面函数
}

int main()
{
    int arr[] = { 3,5,7,8,0,2,1,4,6,9 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz);
    for (int i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

总结

       在这一部分,小编详细地编写了有关数组的一篇博客。希望大家看完以后,进行点评,谢谢大家!文章来源地址https://www.toymoban.com/news/detail-633082.html

到了这里,关于初始C语言——详细地讲解数组的内容以及易错点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【初始C语言2】详细认识分支语句和循环语句以及他们的易错点,应用(猜大小游戏)

    系列文章目录  第一章 “C“浒传——初识C语言(更适合初学者体质哦!)  第二章  【初始C语言2】详细认识分支语句和循环语句以及他们的易错点,应用(猜大小游戏) 目录 系列文章目录 前言:        一、什么是语句? 1.1 表达式语句 1.2 函数调用语句 1.3 控制语句

    2024年02月10日
    浏览(45)
  • 细讲Labview条件结构用法及易错点

    本文讲解Labview条件结构的常用情景及易错点注意事项。帮助大家深刻理解并使用该结构,欢迎点赞关注加评论,有问题可以私聊或在下方评论区留言。 本文程序均附在文章结尾,可自行下载学习。 博主之前讲过Labview事件结构、For循环等的基础知识介绍,有兴趣强化基础的小

    2024年01月20日
    浏览(36)
  • 【初阶C语言】初阶结构体详细讲解

    结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 例如描述一个学生: 结构的成员可以是标量、数组、指针,甚至是其他结构体。 有了结构体类型,那如何定义变量,其实很简单。 结构体变量访问成员 结构变量的成员是通过点操作符(

    2023年04月12日
    浏览(36)
  • 【初阶C语言】实现扫雷(详细讲解+全部源码)

    本游戏用到了三个文件 两个源文件:扫雷.c ,game.c 一个头文件:game.h 想要做好游戏,首要任务就是要把模块想好。 先打印一个游戏菜单 玩家选择是否(1\\0)是否进入游戏 游戏思路:(这次实现的是初级难度的扫雷,棋盘9X9,10个雷) 我们先创建两个二维数组,一个数组布

    2023年04月09日
    浏览(33)
  • (二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】

    🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 🔥🔥 本文已收录于Flask框架从入门到实战专栏 :《Flask框架从入门到实战》 🔥🔥 热门专栏推荐 :《Python全栈系列教程》、《爬虫从入门到精通系列

    2024年03月21日
    浏览(46)
  • 初阶算法(3):二分法的讲解与实现(C语言),以及二分不止光在有序数组中的应用

     第一章 初阶算法(1):通过简单的排序算法来认识时间复杂度  第二章 初阶算法(2):进行详细地介绍插入排序的细节和时间复杂度  第三章 初阶算法(3):二分法的讲解与实现,以及二分不止光在有序数组中的应用 目录 系列文章目录 前言 一、二分法的讲解与实现

    2024年02月14日
    浏览(43)
  • 【C语言】指针的基本知识详细讲解(指针数组、数组指针、函数指针....

    接着上次的函数的基本知识,今天我们来讲一讲🔍指针 目录 一、指针的概念 二、指针变量 三、野指针 四、字符指针 五、指针与数组 六、指针数组 七、数组指针  八、指针与函数 总结 一、指针的概念 1.1、变量和地址 所谓指针,也就是内存的地址;所谓指针变量,也就是

    2023年04月08日
    浏览(38)
  • 初阶C语言-数组

    “少年没有偏旁,自己便是华章!” 今天我们继续一起来学习一下数组的相关知识点。 什么是数组呢? 数组是一组相同类型元素的集合。 数组的初始化是指:在创建数组的同时给数组的内容一些合理初始值(初始化)。 这里,我们要区分以下用字符给数组初始化和用字符

    2024年02月14日
    浏览(36)
  • 【初阶C语言】数组

    目录 一、一维数组 1.一维数组的创建和初始化 2.一维数组的使用 3.一维数组在内存中的存储 二、二维数组 1.二维数组的创建 2.二维数组的初始化 3.二维数组的使用 4.二维数组在内存中的存储 三、数组的越界问题 四、数组传参 前言:  数组在C语言中是一个比较重要的知识点

    2024年02月14日
    浏览(40)
  • 【C语言】初阶测试 (带讲解)

      目录 ① 选择题         1. 下列程序执行后,输出的结果为( ) 2. 以下程序的输出结果是?  3. 下面的代码段中,执行之后 i 和 j 的值是什么()  4. 以下程序的k最终值是: 5. 以下程序的最终的输出结果为: 6. 下列描述中正确的是()  7.C 语言规定,在一个源程序中,

    2024年02月09日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包