c语言基础知识帮助理解(详解数组)

这篇具有很好参考价值的文章主要介绍了c语言基础知识帮助理解(详解数组)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前面梳理完函数和递归的知识后,来进行数组知识的梳理

对函数有疑惑的同学,可以看我之前的文章:c语言基础知识帮助理解(详解函数)_总之就是非常唔姆的博客-CSDN博客 

c语言基础知识帮助理解(函数递归详解)_总之就是非常唔姆的博客-CSDN博客

想做点游戏的同学可以看:

三子棋小游戏(可改棋盘大小)_总之就是非常唔姆的博客-CSDN博客

探索经典游戏:扫雷小游戏_总之就是非常唔姆的博客-CSDN博客

希望能帮助到大家!

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

1.数组是什么

c语言中数组是一种数据结构,用于存储相同数据类型的一组元素。它提供了一种有序的方式来存储和访问多个数据项  

即——数组是一组相同类型元素的集合

---------------------------------------------------------------------

2.数组的创建

数组的创建形式:type  name  [const_n]

其中:

  • type是数组的元素类型
  • name是数组名
  • const_n是一个常量表达式,用来指定数组的大小 

实例 :

需要注意的是:

C99 之前数组只能是常量指定大小,C99 之后引用了变长数组的概念,数组的大小是可以使用变量指定的,但是VS2022、2019 不支持C99的边长数组的

我自己是用的19,便不再讲解边长数组的相关内容。

int main()
{
	int arr1[10];
	int arr2[2 + 3];//这两种情况均未报错

	int x = 0;
	scanf("%d", &x);
	int arr3[x];//这种情况就是变长数组,因为2019不支持,便会报错
	return 0;
}

---------------------------------------------------------------------

3.数组的初始化 

数组的初始化是指在声明数组时为其赋予初始值 

初始化的方式:

  • 逐个元素初始化: 可以逐个为数组的每个元素赋值,用逗号分隔每个元素的值,并用大括号括起来。例如: 
    int arr[5] = {1, 2, 3, 4, 5};
  •  部分元素初始化: 可以只初始化数组的一部分元素,其余元素将被自动初始化为0。例如:
    int main()
    {
    	int arr[4] = { 1,2 };
    	for (int i = 0; i < 4; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    	return 0;
    }

    结果如下:

c语言基础知识帮助理解(详解数组),c语言,数据结构,开发语言

  •  未指定大小初始化:没有指定数组的大小,但根据初始化的元素个数,编译器会自动推断数组的大小。例如:
int main()
{
	int arr[] = { 1,2 };
	printf("%d", sizeof(arr) / sizeof(arr[1]));//我们输出arr的大小
	return 0;
}

结果:

c语言基础知识帮助理解(详解数组),c语言,数据结构,开发语言

  • 字符串初始化: 可以使用字符串字面量来初始化字符数组。例如 
char str[] = "Hello";

需要注意字符串与字符数组的区别: 

1.字符串初始化后会在末尾自动添加一个\0作为字符串结束的标志

2.因为1的原因计算大小使会比看起来相同的字符数组大1,如下

int main()
{
	char arr1 []= "hello";
	char arr2[] = { 'h','e','l','l','o' };
	printf("%d\n", sizeof(arr1) / sizeof(arr1[1]));//我们输出arr1的大小
	printf("%d", sizeof(arr2) / sizeof(arr2[1]));//我们输出arr2的大小
	return 0;
}

 看起来二者均为hello,但是c语言基础知识帮助理解(详解数组),c语言,数据结构,开发语言

我们可以清楚地看到多了一个\0在字符串后面,大小也如我所说:

c语言基础知识帮助理解(详解数组),c语言,数据结构,开发语言

---------------------------------------------------------------------

1.4一维数组的使用

对于数组的使用我们使用这个操作符: [] ,下标引用操作符。它其实就数组访问的操作符 

int main()
{
	//需要注意的是:数组下标是从0开始的
	char arr1 []= "hello";
	char arr2[] = { 'h','e','l','l','o' };
	//对应的下标:   0   1   2   3   4

	printf("%c", arr2[0]);//来输出一个h看看吧

	return 0;
}

c语言基础知识帮助理解(详解数组),c语言,数据结构,开发语言

 其他经常使用的对数组的处理:

int arr[]={1,2,4};
int sz=sizeof(arr)/sizeof(arr[0])-1;
for (i = 0; i <= sz; i++)//这就是数组的遍历,此为遍历输出,也可以遍历输入
	{
		printf("%d ", arr[i]);
	}

总结:

  • 数组是使用下标来访问的,下标是从0开始
  • 数组的大小可以通过计算得到, 利用此语句:intsz=sizeof(arr)/sizeof(arr[0]); 

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

接下来我们探讨数组在内存中的存储 ,利用%p来打印地址:

int main()
{
	int arr[10] = { 0 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);

	for (i = 0; i < sz; ++i)
	{
		printf("&arr[%d]的地址是: %p\n", i, &arr[i]);
	}
	return 0;
}

c语言基础知识帮助理解(详解数组),c语言,数据结构,开发语言 仔细观察后我们发现:随着数组下标的增长,元素的地址,也在有规律的递增

 由此可以得出结论:数组在内存中是连续存放的

 c语言基础知识帮助理解(详解数组),c语言,数据结构,开发语言


二.二维数组的创建和初始化 

1.二维数组的创建 

//二维数组创建
int arr1[1][4];
char arr2[3][5];
double arr3[2][3];

2.二维数组的初始化 

//二维数组初始化
int arr1[3][4] = {1,2,3,4};//这种初始化在一行满了后就换到下一行
int arr2[3][4] = {{1,2},{4,5}};//这种初始化已经规定一行的元素,不够的来填0
int arr3[][4] = {{2,3},{4,5}};//需要注意的是:二维数组如果有初始化,行可以省略,列不能省略

c语言基础知识帮助理解(详解数组),c语言,数据结构,开发语言 通过调试来直接观察各个数组的元素情况

 ---------------------------------------------------------------------

3.二维数组的使用 

二维数组的使用也是通过下标的方式 

 二维数组我们完全可以看成矩阵:

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

我们可以看成: c语言基础知识帮助理解(详解数组),c语言,数据结构,开发语言

那样的话:通过对应的行号和列号的下标就能访问到对应的元素了 

那么二维数组的遍历:

int main()
{
	int arr[2][3] = { {1,4},{2,3} };
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d ", arr[i][j]);
		}
	}
	return 0;
}

c语言基础知识帮助理解(详解数组),c语言,数据结构,开发语言  ---------------------------------------------------------------------

4.二维数组在内存中的存储

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

c语言基础知识帮助理解(详解数组),c语言,数据结构,开发语言 每一个之间的差值是4(一个整形的大小):通过结果我们可以分析到,其实二维数组在内存中也是连续存储的

 三.数组越界

数组的下标是有范围限制的。
数组的下规定是从 0 开始的,如果数组有 n 个元素,最后一个元素的下标就是 n-1
所以数组的下标如果小于 0 ,或者大于 n-1 ,就是数组越界访问了,超出了数组合法空间的访问。
C 语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就 是正确的
所以我们在写代码时,要自己做越界的检查。
int main()
{
	int arr[8] = { 1,2,3,4,5,6,7,8 };
	for (int i = 0; i <= 10; i++)
	{
		printf("arr[%d]=%d\n",i, arr[i]);//当i等于8开始后就已经越界了,但是编译器没有报错
	}
	return 0;
}

c语言基础知识帮助理解(详解数组),c语言,数据结构,开发语言

可以看出,越界后数组储存的就是随机值了,所以还是要避免数组越界


 四.数组作为函数参数

1.数组名是什么?

数组名是数组首元素的地址。(有两个例外)

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

 除此1,2两种情况之外,所有的数组名都表示数组首元素的地址。

2.数组传参

当数组传参的时候,实际上只是把数组的首元素的地址传递过去了,有时我们必须要在外面先知道长度后,再传参时把那个长度一起传过去 


希望本文对你理解和使用一维数组有所帮助。通过不断的练习和实践,你将能够熟练地使用一维数组,并将其应用于解决实际问题中。祝大家在C语言的学习和编程实践中取得进步! 文章来源地址https://www.toymoban.com/news/detail-632401.html

到了这里,关于c语言基础知识帮助理解(详解数组)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【C语言初阶】带你轻松掌握指针基础知识完结篇——野指针,指针运算,指针和数组,二级指针

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,这里是君兮_,今天继续给大家更新0基础入门C语言的内容,我们这次主要更新的依然是初阶指针的基础知识 废话不多说咱们直接开始吧!! 概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有

    2024年02月16日
    浏览(46)
  • C语言格式化输出函数printf详解——C语言基础知识

    (由于篇幅较长,内容较全,建议收藏) printf函数的一般格式为: printf(格式控制字符串,输出值参数表); 如: 其中, f=%f,c=%fn 是 格式控制字符串 , f,c 是 输出值参数表 。 (1)格式控制字符串是用双引号括起来的字符串,包括三类信息: 格式字符。格式字符由“%”

    2023年04月08日
    浏览(42)
  • 数组基础知识二

    特别说明 一维数组的定义(对数组空间进行清理,置0,不会产生随机值):数组在使用前要先定义;告诉编译器数组元素的类型;编译器会给这个数组预先分配连续的存储空间;定义的格式为:元素类型名 数组名[数组长度]。 1、一维数组的遍历 :在操作数组时,经常需要

    2024年02月05日
    浏览(33)
  • MATLAB基础知识之数组与矩阵

    本文是参考书籍《MATLAB R2020a完全自学一本通 》自己整理的一些笔记和一些练习,希望会给大家带来一些帮助。 目录 1、数组创建与运算 1.1数组的创建 1.2数组的运算 1.2.1 算术运算  1.2.2关系运算与逻辑运算  2、矩阵的构造与操作 2.1矩阵的构造 2.2矩阵的操作 2.3矩阵索引  2

    2024年02月07日
    浏览(41)
  • 音视频基础知识——素材理解

    素材是媒体内容生产中一切生产资料的集合,包括不限于视频、音频、图片、字幕等形式。 素材通过统一的协议把原始的数据有序组织起来,便于编辑与管理。比如一般的素材是由一个物理文件及其各类属性构成,在对素材进行剪辑处理时,不用改变源文件中的任何内容,通

    2024年02月01日
    浏览(56)
  • 理解FPGA的基础知识——逻辑电路

    FPGA (Field Programmable Gate Aray,现场可编程门阵列)是一种可通过重新编程来实现用户所需逻辑电路的半导体器件。为了便于大家理解FPGA的设计和结构,我们先来简要介绍一些逻辑电路的基础知识。 1.逻辑代数     逻辑代数中的变量称为逻辑变量,用大写字母表示。逻辑变量的取

    2024年02月09日
    浏览(43)
  • 深入理解机器学习——关联规则挖掘:基础知识

    分类目录:《深入理解机器学习》总目录 许多商业企业在日复一日的运营中积聚了大量的数据。例如,食品商店的收银台每天都收集大量的顾客购物数据。下图给出一个这种数据的例子,通常称作购物篮事务(Market Basket Transaction)。表中每一行对应一个事务,包含一个唯一

    2024年02月10日
    浏览(44)
  • 深入理解 HTTP Authorization 头:基础知识

    在当今的互联网世界中,安全性贯穿于 web 应用的每个方面,HTTP Authorization 头的使用在这个过程中扮演着不可或缺的角色。它是 HTTP 请求中的一个重要部分,用来在客户端和服务器之间安全地传输认证信息。用途广泛,无论是浏览器还是其他客户端应用,都依赖它来验证用户

    2024年04月15日
    浏览(43)
  • 音视频基础知识-时间戳的理解

    问题背景: 凡是和流媒体和音视频打交道,时间戳基本是一个必须深刻理解的概念。你会在各种各样的传输协议和封装格式中看到这个东西,而且表现形式还不一样。其次这个概念会涉及到音视频播放的同步问题,也会影响音视频播放的控制问题。前者说的是音画同步,后者

    2023年04月08日
    浏览(47)
  • 深入理解 C++ 语法:从基础知识到高级应用

    让我们将以下代码分解以更好地理解它: 示例 示例解释 第 1 行: #include iostream 是一个头文件库,它让我们可以使用输入和输出对象,比如 cout (在第 5 行使用)。头文件为 C++ 程序添加功能。 第 2 行: using namespace std 表示我们可以使用标准库中的对象和变量名称。 如果你

    2024年03月23日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包