c语言基础:数组的运用以及在内存中的地址的理解

目录

目录:

1.数组作为函数参数

2.数组在内存中的存储

     2.1数组名是什么?

   

2.2下面我们来探讨二维数组的各个名字表示什么

二维数组的首元素地址是什么呢?

*arr表示的是什么呢 ?(arr是二维数组)


1.数组作为函数参数

为啥错了

void bubble_sort(int arr[])
{
	int sz = sizeof(arr) / sizeof(arr[0]);//这样对吗?
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

int main()
{
	int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
	bubble_sort(arr);//是否可以正常排序?
	int i = 0;
	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

当数组传参的时候,实际上只是把数组的首元素的地址传递过去了。

所以接收的是指针,指针的大小是4个字节,4/4=1,sz大小是1.

我们指针数组名就是首元素地址,毫无疑问,传参的时候arr传过去就是首元素地址,只是为了便于理解,我们说把数组传过去了,数组传过去了,我们拿一个数组接收,所以我们的形参写的是int arr[];但是,实际上我们写的规范一点应该写一个指针去接收, 

正确的冒泡排序:(在主函数算出sz,再传给形参。)

void bubble_sort(int arr[],int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

int main()
{
	int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);

	bubble_sort(arr,sz);//是否可以正常排序?
	int i = 0;
	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

2.数组在内存中的存储

     2.1数组名是什么?

我们已经知道数组是在内存中是连续存放的,内存为数组分配好空间,每个空间有具体的地址指向,

int arr[10] = { 1,2,3,4,5 };
	printf("%p\n", arr);//数组名
	printf("%p\n", &arr[0]);//第一个元素的地址
	printf("%d\n", *arr);//对数组名解引用

我们看看上面代码运行的结果

分析结果可知,数组名和第一个元素的地址一样,而且对地址解引用得到的结果也是第一个元素

结论:

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

1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数 组。

2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。  

请大家熟记这两个例外,很多时候很容易错,在我很多博客也都写过这两个例外 

证明如下: 

   

int arr[10] = {0};
printf("%d\n", sizeof(arr));

我们知道如果此时数组是首元素地址,而sizeof 是计算所占内存空间的大小,单位是字节,一个地址存起来只需要4个字节,按理说答案是4,可以我们运行结果是

答案是40,所以说此时arr不是首元素地址,而是整个数组,4*10=40 

再来:第二个例外:看看如下代码:

int a[3] = { 0 };
	printf("%p\n", &a);
	printf("%p\n", a);
	printf("%p\n", &a+1);
	printf("%p\n", a+1);

可以看出&a与a是不一样的,&a+1,跳过了整个数组的大小,数组大小刚刚3*4=12,a+1只跳过一个元素大小。 

2.2下面我们来探讨二维数组的各个名字表示什么


int a[3][4]={0};
a[0]//第一行数组的首地址
&a[0]//第一行数组的地址

我们验证一下:

int  arr[3][4] = { {1,2,3},{4,5} };
	printf("arr[0]=%p\n", arr[0]);
	printf("&arr[0]=%p\n", &arr[0]);
	printf("arr[0]+1=%p\n", arr[0]+1);
	printf("&arr[0]+1=%p\n", &arr[0]+1);

运行结果如下:

可以看出arr[0]与&arr[0]与一维数组很像,arr[0]就是第一行数组的首地址,就相当于一维数组的数组名一样,加1只跳过一个元素,&arr[0]就是第一行数组的地址,就相当于一维数组的数组名加&一样,加一跳过第一行的所有元素,刚好是+16=4*4 

二维数组的首元素地址是什么呢?

二维数组的首元素地址不是第一行第一列元素的地址,而是第一行元素的地址,即相当于把二维数组变成一维数组,把一维数组看成二维数组的元素,即第一行的所有元素就是二维数组的第一个元素,

验证:

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

arr+1跳过20个字节,说明跳过了4*5即第一行的所有元素, 

总结:二维数组首元素是第一行的元素的地址,与上面&a[0]一样。

*arr表示的是什么呢 ?(arr是二维数组)

我们前面知道arr是二维数组中第一行元素的1地址,解引用*arr就得到了第一行的所有元素,就相当于得到了第一行的数组名,也就相当于得到了第一行的首元素地址------即相当于arr[0].

如果理解起来有点绕,再举下面的例子,实在不行请背下吧!!!!!

我们先看一维数组

所以总而言之:

          *arr 相当于 arr[0] 这个也相当于 第一行数组的 首地址,但此时类型发生了变化,这相当于是一个指向 Int 类型的指针,所以+1后的跨度是 4 个字节,*arr + 1 就指向了第一行的第二个元素的地址

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

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

相关文章

C语言 | Leetcode C语言题解之第116题填充每个节点的下一个右侧节点指针

题目&#xff1a; 题解&#xff1a; struct Node* connect(struct Node* root) {if (root NULL) {return root;}// 从根节点开始struct Node* leftmost root;while (leftmost->left ! NULL) {// 遍历这一层节点组织成的链表&#xff0c;为下一层的节点更新 next 指针stru…

echarts学习篇

一、使用echarts 1.引入 Apache ECharts <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <!-- 引入刚刚下载的 ECharts 文件 --> <script src"echarts.js"></script> </head> </html> 2.…

设计模式 19 模板模式 Template Pattern

设计模式 19 模板模式 Template Pattern 1.定义 模板模式&#xff08;Template Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个算法的骨架&#xff0c;将一些步骤的具体实现延迟到子类中。在模板模式中&#xff0c;定义了一个抽象类&#xff0c;其中包含了一个…

[论文笔记]Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

引言 今天带来思维链论文 Chain-of-Thought Prompting Elicits Reasoning in Large Language Models的笔记。 作者探索了如何通过生成一系列中间推理步骤的思维链&#xff0c;显著提升大型语言模型在进行复杂推理时的能力。 1 总体介绍 语言模型的规模扩大已被证明能够带来…

基于Netty实现安全认证的WebSocket(wss)服务端

1.Netty服务端 服务端代码参考【基于Netty实现WebSocket服务端-CSDN博客】中的两种方式都可以&#xff1b;这里用的是第一种简单方式。 新增如下逻辑&#xff1a;添加SSLHandler SSLContext sslContext SslUtil.createSSLContext("JKS","D:\\workSpace\\day…

编译qt5.15.2(mac/windows)的mysql驱动(附带编译好的文件)

文章目录 0 背景1 编译过程2 福利 0 背景 因为需要连接到mysql数据库&#xff0c;所以需要连mysql驱动。 1 编译过程 1&#xff0c;打开文件/Users/mac/Qt5.14.2/5.14.2/Src/qtbase/src/plugins/sqldrivers/sqldrivers.pro&#xff0c;注释掉QMAKE_USE mysql&#xff1b; 如…

[数智人文实战] 02.舆情分析之词云可视化、文本聚类和LDA主题模型文本挖掘

【数智人文与文本挖掘】知识星球建立且正式运营,欢迎新老博友和朋友加入,一起分享更多数智人文知识和交流进步。该星球计划每周至少分享7个资源或文章,包括数智人文、文本挖掘、人工智能、大数据分析和图书情报的技术文章、代码及资源。同时,欢迎进入星球的朋友咨询我图情和…

多线程基本常识

多线程的状态 在Java中&#xff0c;一个线程的生命周期有以下几种状态&#xff1a; 新建&#xff08;New&#xff09;&#xff1a;当线程对象被创建时&#xff0c;线程处于新建状态。此时线程对象存在&#xff0c;但还没有调用start()方法启动线程。 运行&#xff08;Runnable…

Vulnhub - AI-WEB-1.0靶机教程

目录 站点信息收集 c段扫描 端口扫描 目录扫描 漏洞利用 使用 burp 抓包 查询数据库名 查询数据库下的表 查询表中的字段名 查询字段中的数据 --os-shell 上传一句话木马 下载地址&#xff1a;https://download.vulnhub.com/aiweb/AI-Web-1.0.7z 我们从站点信息收…

【C/C++】观察者模式

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

LAMP网络服务架构

目录 LAMP 网站服务架构 LAMP的组成部分 LAMP的构建顺序 安装论坛 0.电脑已编译安装Apache&#xff0c;MySQL&#xff0c;PHP 1.创建数据库&#xff0c;并进行授权 2.上传论坛压缩包到 /opt ,并解压 3.上传站点更新包 4.更改论坛目录的属主 5.浏览器访问验证 LAMP 网…

授权调用: 介绍 Transformers 智能体 2.0

简要概述 我们推出了 Transformers 智能体 2.0&#xff01; ⇒ &#x1f381; 在现有智能体类型的基础上&#xff0c;我们新增了两种能够 根据历史观察解决复杂任务的智能体。 ⇒ &#x1f4a1; 我们致力于让代码 清晰、模块化&#xff0c;并确保最终提示和工具等通用属性透明化…

PPT大珩助手新功能-生成迷宫

大珩助手是一款功能丰富的办公软件插件&#xff0c;它主要分为两个版本&#xff1a;PPT大珩助手和Word大珩助手。这两个版本都旨在提高用户在处理演示文稿和文档时的效率。 PPT大珩助手 这是一款专门为Microsoft PowerPoint设计的插件。它提供了多种功能&#xff0c;例如素材…

深入理解Kubernetes的调度核心思想

一、引言 Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排系统&#xff0c;用于自动化部署、扩展和管理容器化应用程序。在Kubernetes集群中&#xff0c;调度器是一个核心组件&#xff0c;它负责将Pod&#xff08;Kubernetes中的最小部署单元&#xff09;分配…

windows内存管理

一 windows系统的内存管理涉及哪些 1.1 虚拟内存管理机制 windows操作系统使用虚拟内存技术&#xff0c;将磁盘文件&#xff0c;通过映射对象&#xff08;存储在物理内存&#xff09;关联&#xff0c;映射到虚拟内存作为文件试图。即用户操作"虚拟内存中File View Objec…

【C语言】10.C语言指针(2)

文章目录 1.数组名的理解2.使用指针访问数组3.一维数组传参的本质4.冒泡排序算法步骤 5.二级指针6.指针数组7.指针数组模拟二维数组 1.数组名的理解 int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];这里我们使用 &arr[0] 的方式拿到了数组第一个元素的地址&am…

Stable Diffusion【写实模型】:逼真,逼真,超级逼真的国产超写实摄影大模型万享XL

今天和大家分享的是一个国产万享系列中使用量最高的大模型:万享XL_超写实摄影&#xff0c;顾名思义&#xff0c;该大模型主要是面向写实摄影&#xff0c;一方面生成的图片人物皮肤纹理细节超级逼真&#xff0c;另一方面对于光影效果的处理也非常到位。对于万享XL超写实摄影大模…

数组单调栈-901. 股票价格跨度、leetcode

单调栈作为一种数据结构在求解类递增、递减方面的题目中有较为广泛的应用&#xff0c;在以往的leetcode中所见到的相关单调栈的题目均为单一元素&#xff0c;今天刷到901题目时&#xff0c;想到了将数组元素作为单调栈中元素的方法进行求解。 题目链接及描述 901. 股票价格跨…

秋招突击——算法打卡——5/27——复习{寻找特定中位数}——新做:{最长回文字串、Z 字形变换}

文章目录 复习——寻找特定中位数新作——最长回文子串个人思路分析实现代码参考学习和上述思路相同&#xff0c;枚举中心点字符串哈希二分 新作——Z 字形变换个人做法思路分析实现代码 参考解法分析总结 复习——寻找特定中位数 第一次的链接&#xff1a;寻找中位数本来以为…

Reactor模式Proactor模式

1.Reactor/Dispatcher模式 1.1 概述 Reactor模式下&#xff0c;服务端的构成为Reactor 处理资源池。其中&#xff0c;Reactor负责监听和分发事件&#xff0c;而处理资源池则负责处理事件。 该模式下的组合方案有下面几种(第三种几乎没有被实际应用)&#xff1a; 1 * Reacto…