C语言数组详解

一维数组

创建和初始化

数组就是一组相同元素的集合。

他的创建:

char arr[10];
int arr1[5];

数组创建中 [] 里不能是变量,但是在c99标准之后就可以了被称为变长数组,但是不常用,而且变长数组不能初始化。

初始化:

//数组的初始化
int main()
{
	int arr[10] = { 1,2,3,4,5 };//不完全初始化,剩下的都是0
	int arr1[] = { 1,2,3,4 };
	int arr2[10] = { 0 };
	int arr3[] = { 0 };//这两种是不一样的初始化,arr2是十个元素,arr3是一个
}

创建数组的时候,如果不想指定 [] 的大小,就得初始化,数组的元素个数由初始化内容确认,例如:arr1,他的元素个数就是四个。

数组 arr 属于不完全初始化,但是他的元素个数还是10个,只不过剩下的初始化为0了。

arr2 和 arr3 要区分,他们的元素个数是不一样的。

一维数组的使用

//一维数组的使用
int main()
{
	int arr[10];
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("%d\n", sz);
	for (int i = 0; i < sz ; i++)
	{
		arr[i] = i;
	}	
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

这个代码第一个循环我们可以自己初始化数组里的内容,第二个循环输出数组。我们用  sizeof(arr) / sizeof(arr[0]  可以来计算数组里有多少个元素。

总结:1.数组里的元素个数可以计算。

            2.数组使用下标来访问,下标从0开始。

一维数组在内存中的存储

//一维数组在内存中的存储
int main()
{
	int arr[10];
	int sz = sizeof(arr) / sizeof(arr[0]);
	//printf("%d\n", sz);
	for (int i = 0; i < sz ; i++)
	{
		arr[i] = i;
	}
	for (int i = 0; i < sz; i++)
	{
		printf("%p\n", &arr[i]);
	}
}//四个字节的存储因为是int类型   连续存储  随下标的增长地址从低到高

我们可以看到一维数组在内存中是连续存储的,而且每个地址都差四个,因为数组类型是 int ,int类型是四个字节的存储,每个字节都有一个地址,所以差四个。而且随下标的增长地址从低到高

二维数组

创建和初始化

创建:

char arr[2][3];
int arr1[3][4];

初始化:

int main()
{
	//      行 列
	int arr[2][3] = { {1,2,3},{4,5,6} };
	int arr1[2][3] = { 1,2,3,4,5,6 };//编译器会自己把他们分开
	int arr2[2][3] = { {1,2},{3,4} };//不完全初始化
	int arr3[][3] = { {1,2,3 }, {4, 5, 6} };//行可以省略,列不可以。
}

其实二维数组可以理解成几个一维数组的集合。我们可以调试看看他们存储的值:

看到 arr1 确实编译器给他分开了,二维数组的不完全初始化也会补0。

二维数组的使用

//二维数组的使用
int main()
{
	int arr[2][3] = { 1,2,3,4,5,6 };
	int i = 0;
	for (i = 0; i < 2; i++)
	{
		int j = 0;
		for (j = 0; j < 3; j++)
		{
			printf("%d ", arr[i][j]);
		}
	}
}

二维数组在内存中的存储

//二维数组内存中的存储
int main()
{
	int arr[2][3] = {1,2,3,4,5,6};
	int i = 0;
	for (i = 0; i < 2; i++)
	{
		int j = 0;
		for (j = 0; j < 3; j++)
		{
			printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);//也是连续存储的,随下标的增长地址从低到高
		}
	}
}

可以看到二维数组和一维数组在内存中存储的方式一样,连续存储,差四个字节,随下标地址从低到高。

数组越界

int main()
{
	int arr[10];
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("数组里有%d个元素\n", sz);
	for (int i = 0; i < sz ; i++)
	{
		arr[i] = i;
	}	
	for (int i = 0; i <= sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

我就用一维数组的代码,做了修改,让 i <= sz ,这样 i  会等于 10 ,这样就数组越界了。

超出了数组合法空间的访问,但是编译器不报错,但是不代表代码就是正确的。所以使用时自己最好检查,二维数组也会越界。

数组名的不同意义

为了探讨数组名的意义,我们看一个冒泡排序的函数:(不知道冒泡排序可以关注我,我后面会讲解

//函数错误版本:数组传参的数组名是什么,是首元素的地址。
void sort(int arr[])
{
	int sz = sizeof(arr) / sizeof(arr[0]);//所以怎么计算sz都等于1.因为地址都是等于四个字节的
	for (int i = 0; i < sz - 1; i++)
	{
		for (int j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] < arr[j + 1])
			{
				int tem = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tem;
			}
		}
	}
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	sort(arr);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
}

我们需要把数组的元素从大到小打印出来,我们看看这个代码的结果:

他没有完成我们的任务,为什么会这样?

这样我们打印sz 的值看看

发现 sz是1,但是我们不是让他计算数组的元素个数吗,为什么会是1呢,就是因为我们函数传参的时候传的是数组名,这里的数组名代表的是数组的首元素地址,而地址的大小永远都是 4 /  8  

个字节。

所以我们正确的样子是:

//函数正确版本:
void sort(int arr[],int sz)
{
	//int sz = sizeof(arr) / sizeof(arr[0]);//给他换到主函数里
	for (int i = 0; i < sz - 1; i++)
	{
		for (int j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] < arr[j + 1])
			{
				int tem = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tem;
			}
		}
	}
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	sort(arr,sz);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
}

通过这个例子我们就发现数组名是首元素地址的意义。

当然有两个例外:1 . sizeof( 数组名 ) 这里计算的计算整个数组的大小

2. &数组名,这里也是取出的整个数组的地址。

但是整个数组的地址在数字上和首元素地址相同,给他们分别加1 就可以看出区别了:

int main()
{
	int arr[10];
	printf("%p\n", arr + 1);
	printf("%p\n", &arr[0] + 1);
	printf("%p\n", &arr + 1);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/504787.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

这两个比较经典的LVS问题怎么解?

今日景芯SoC VIP学员遇到的LVS问题&#xff0c;比较经典&#xff0c;大家先思考下。然后本文末尾分享下2.5GHz A72训练营的LVS解法&#xff1a; 问题1&#xff1a; 问题2&#xff1a; 修改后&#xff1a; 具体修改方案参见知识星球&#xff0c;接下来分享下2.5GHz A72项目的LV…

如何使用固定公网地址远程访问内网Axure RP生成的网站原型web页面

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

StructStreaming Batch mode和Continuous mode

StructStreaming Batch mode和Continuous mode 让我们把目光集中到 Structured Streaming&#xff0c;也就是流处理引擎本身。Structured Streaming 与 Spark MLlib 并列&#xff0c;是 Spark 重要的子框架之一。值得一提的是&#xff0c;Structured Streaming 天然能够享受 S…

C语言刷题总结

1.网购问题 &#xff08;1)这道题目需要分多种情况进行考虑&#xff1a;双11还是双12&#xff0c;有无优惠券&#xff0c;是否会出现优惠券的面值大于购买商品的单价&#xff08;这个时候直接按0元进行处理&#xff09;&#xff1b; &#xff08;2&#xff09;在对于优惠券的分…

Ansible-3

block任务块&#xff1a;可以通过block关键字&#xff0c;将多个任务组合到一起&#xff1b;将整个block任务组一起控制是否要执行。 如果test组中的主机系统发行版是Redhat则安装并启动httpd。原本这是需要两个任务安装和执行&#xff0c;通过block整合为一个任务执行。 rescu…

PyLMKit(9):ChatTable与你的表格聊天,表格问答

功能介绍 与你的结构化数据聊天&#xff1a;支持主流数据库、表格型excel等数据&#xff01; ChatDB&#xff1a;支持数据库问答ChatTable&#xff1a;支持txt,excel,csv等pandas dataframe表格的问答 1.下载安装 pip install pylmkit -U pip install pandasql2.ChatTable实…

阿里云ECS服务器经济型e实例详解,CPU性能测评

阿里云服务器ECS经济型e系列是阿里云面向个人开发者、学生、小微企业&#xff0c;在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器&#xff0c;CPU处理器采用Intel Xeon Platinum架构处理器&#xff0c;支持1:1、1:2、1:4多种处理器内存配比&#xff0c…

STM32——超声测距HC_SR04记录

一、HC_SR04简述 HC-SR04超声波测距模块可提供 2cm-400cm的非接触式距离感测功能&#xff0c;测距精度可达高到 3mm&#xff1b;模块包括超声波发射器、接收器与控制电路。 基本工作原理&#xff1a; (1)采用IO 口TRIG 触发测距&#xff0c;给最少10us 的高电平信呈。 (2)模块…

C/C++函数字符串和数字的互相转化(比赛超实用)

字符串和数字相互转化: 1 数字转字符串: 实现方法:to_string函数 存在头文件: string 实现代码: #include<iostream> #include<string> using namespace std; int main() {int a 114514;string s to_string(a);cout << s[0] << endl;cout <<…

Spring Web MVC的入门学习(一)

目录 一、什么是 Spring Web MVC 1、MVC 定义 二、学习Spring MVC 1、项目准备 2、建立连接 2.1 RequestMapping 注解的学习 2.2 RequestMapping 使用 3、请求 3.1 传递单个参数 3.2 传递多个参数 3.3 传递对象 3.4 后端参数重命名&#xff08;后端参数映射&#xf…

【LeetCode: 331. 验证二叉树的前序序列化 + DFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

我的创作纪念日-一周年

&#x1f600;前言 不知不觉过了一年了很感慨也很期待未来 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 我的创作纪念日-一周年机缘收获(荣誉)日常成就憧憬 我的创作纪念日-一周年 机缘 在我开始在 CSDN 上发布文章之前&#xff0c;我对这个平台几乎一无所知。随着时…

[创业之路-102] :结构化思考:产学研人才联合创业公司的特点、优点与困境

目录 前言&#xff1a; 一、什么是产学研 1.1 什么是产学研 1.2 什么是产学研人才联合创业 二、产、学、研的区别、各自的特点 2.1 产业&#xff08;产&#xff09;特点 2.2 其次&#xff0c;学术&#xff08;学&#xff09;特点 2.3 科学研究&#xff08;研&#xff0…

VS Code常用前端开发插件和基础配置

VS Code插件安装 VS Code提供了非常丰富的插件功能&#xff0c;根据你的需要&#xff0c;安装对应的插件可以大大提高开发效率。 完成前端开发&#xff0c;常见插件介绍&#xff1a; 1、Chinese (Simplified) Language Pack 适用于 VS Code 的中文&#xff08;简体&#xff…

PostCSS的安装及使用 (2):使用及问题解决

PostCSS是一个CSS处理器&#xff0c;它通过插件系统可以转换CSS代码&#xff0c;使其具备更多的功能或符合特定规范。 PostCSS的使用&#xff1a; 安装PostCSS CLI和插件 # 全局安装PostCSS CLI&#xff08;可选&#xff0c;一般在项目内安装&#xff09;npm install -g postc…

Kerberos 认证 javax.security.auth.logon.LoginException:拒绝链接 (Connection refused)

kerberos 服务重启之后异常 项目中用到了hive 和hdfs &#xff0c;权限认证使用了Kerberos&#xff0c;因为机房异常&#xff0c;导致了Kerberos 服务重启&#xff0c;结果发现本来运行正常的应用服务hive 和hdfs 认证失败&#xff0c;报错信息是 典型的网络连接异常 排查思路…

鸿蒙开发之ArkUI组件常用组件图片和文本

ArkUI即方舟开发框架是HarmonyOS应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff08;组件、布局、动画以及交互事件&#xff09;&#xff0c;以及实时界面预览工具等&#xff0c;可以支持开发者进行可视化界面开发。 开发文档地址 &…

AI大模型学习在医疗领域的应用与挑战

AI大模型学习在医疗领域的应用与挑战 文章正文&#xff1a;一、AI大模型学习在医疗领域的应用二、AI大模型学习在医疗领域面临的挑战总结&#xff1a; 文章正文&#xff1a; 随着人工智能技术的飞速发展&#xff0c;AI大模型学习在各个领域都取得了显著的成果。本文将探讨AI大…

使用Sui CLI在Sui上创建和执行PTBs

Sui命令行界面&#xff08;CLI&#xff09;中的新命令允许用户直接从终端或Bash脚本创建和执行可编程交易区块&#xff08;PTB&#xff09;。这个新命令为开发人员在实现和执行PTB方面提供了更大的灵活性。 PTB为开发人员提供了一种非常强大的编程工具&#xff0c;这在其他区块…

商务口语每天学习,柯桥英语培训

今天天气好 Its a nice day today. 今天天气真好。(搭讪) Ive heard too much about you. 久仰大名。(恭维) Remember me to... 请代我向……问好。(问候) 半个句型要记牢 Its a ~(nice/good/bad) day today. Tip: 如果你想和某人搭讪而找不着好的借口时&#xff0c;就说天气…