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 就指向了第一行的第二个元素的地址

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【NumPy】掌握NumPy的divide函数:执行高效的数组除法操作

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

【Python】解决Python错误报错:IndexError: tuple index out of range

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

视频拼接融合产品的产品与架构设计(四)分布式GPU运算合并单元

上一篇如下 视频拼接融合产品的产品与架构设计(三&#xff09;内存和显存单元数据迁移 视频合并单元说明 对下面这张图做些说明&#xff0c;视频接入是比较常见&#xff0c;可以说是普通&#xff0c;但是做到接入后随即进行比较重的算法运算&#xff0c;这个在视频领域并不多…

npm run dev 同时运行vue前端项目和node后端项目

将两个项目放到一个目录下 项目拖进vscode中&#xff0c;安装包依赖&#xff0c;修改配置 npm i concurrently "dev": "concurrently \"vite --mode development\" \"nodemon app.js\"" 命令行 npm run dev 运行 没有运行成功排查 …

基于Linux的文件操作(socket操作)

基于Linux的文件操作&#xff08;socket操作&#xff09; 1. 文件描述符基本概念文件描述符的定义&#xff1a;标准文件描述符&#xff1a;文件描述符的分配&#xff1a; 2. 文件描述符操作打开文件读取文件中的数据 在linux中&#xff0c;socket也被认为是文件的一种&#xff…

Maven简介和快速入门

1.1Maven介绍 Maven – Introduction (apache.org) Maven就是一个软件&#xff0c;掌握软件安装、配置、以及基本功能&#xff08;项目构建、依赖管理&#xff09;。 1.2Maven主要作用 1.依赖管理&#xff1a; Maven 可以管理项目的依赖&#xff0c;包括自动下载所需依赖库、…

GIS Java 生成四至图

目录 前言 操作步骤&#xff1a; 1&#xff0c;求出多边形的四至点 2&#xff0c;下载地图 3&#xff0c;绘制多边形 前言 对于地图上的一个多边形地块&#xff0c;其四至图就是能够覆盖这个多边形的最小矩形&#xff0c;也就是求出这个多边形的最东点&#xff0c;最西点&…

这款信创FTP软件,可实现安全稳定的文件传输

信创&#xff0c;即信息技术应用创新&#xff0c;2018年以来&#xff0c;受“华为、中兴事件”影响&#xff0c;国家将信创产业纳入国家战略&#xff0c;并提出了“28n”发展体系。“8”具体指金融、石油、电力、电信、交通、航空航天、医院、教育等主要行业。目前企业使用比较…

【Python】解决Python报错:AttributeError: ‘int‘ object has no attribute ‘xxx‘

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

Spring Boot详解:深入了解与实践

文章目录 1. Spring Boot简介1.1 什么是Spring Boot&#xff1f;1.2 Spring Boot的历史背景1.3 Spring Boot的核心特点 2. Spring Boot的核心概念2.1 自动配置2.1.1 自动配置原理2.1.2 自定义配置 2.2 Spring Boot Starter2.3 Spring Boot CLI 3. Spring Boot的主要功能模块3.1…

【SpringMVC】_设置响应状态码与Header

目录 1. 设置响应状态码 2. 设置响应Header 2.1 设置Content-Type 2.1.1 不使用RequestMapping的produce属性 2.1.2 使用RequestMapping的produce属性 2.2 设置/新增其他Header 1. 设置响应状态码 Spring是基于servlet实现的&#xff0c;设置HTTP响应的状态码可以通过se…

React-组件通信

组件通信 概念&#xff1a;组件通信就是组件之间的数据传递&#xff0c;根据组件嵌套关系的不同&#xff0c;有不同的通信方法 父传子 基础实现 实现步骤&#xff1a; 1.父组件传递数据-在子组件标签上绑定属性 2.子组件接收数据-子组件通过props参数接收数据 props说明 1.…

校园导航系统C++

制作一个简单的大学城导航系统&#xff0c;根据用户指定的起点和终点&#xff0c;求出最短路径长度以及具体路径。 项目要求&#xff1a; 1&#xff09;程序与数据相分离&#xff0c;地图中的所有数据都是从文件读入&#xff0c;而不是写在代码中 2&#xff09;最短路径算法…

基础—SQL—DML(数据操作语言)插入数据

一、介绍 分类全称说明DMLData Manipulation Language数据操作语言。用来对数据库表中的数据进行增删改(插入、删除、修改) 则增、删、改是三个操作也就对应着三个关键字&#xff0c;分别是&#xff1a; 添加数据&#xff1a;&#xff08; INSERT &#xff09;修改数据&#…

游戏逆向工具分析及解决方案

游戏逆向&#xff0c;是指通过各类工具对游戏进行反编译及源码分析&#xff0c;尝试分析游戏的实现逻辑的过程。这个过程需要使用解密、反编译、解压缩等技术&#xff0c;目的是还原或分析出游戏的代码逻辑及资源。 游戏逆向工具可以按照不同功能进行划分&#xff0c;如&#…

JVM的相关知识

一.JVM内存区域划分&#xff08;JVM是一个Java进程&#xff09; 一个进程运行过程中就需要重操作系统这里申请到一些内存资源 JVM也是如此&#xff0c;搞一大块内存&#xff0c;供Java代码执行时使用 JVM把这一大块内存又划分成不同的区域&#xff0c;分别代表不同的用途 各个…

Qt 5桌面APP开发实战

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 第一节&#xff1a;Qt 5桌面APP开发实战入门 Qt 5的跨平台特性 Qt 5的界面设计工具 Qt 5的…

Java基础语法规范

语法规范 public class HelloWorld{ //类名&#xff1a; 1. 首字母要大写 2. 源文件名与类名相同// 单行注释/* 多行注释除这两个之外还有文档注释。不重要* /public static void main (String[] args){ /* 1. main()⽅法是类体中的主⽅法&#xff0c;该⽅法从{开始到}结束…

商用未来何时来?软银揭示量子计算商业应用现状

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨沛贤/浪味仙 排版丨沛贤 深度好文&#xff1a;3000字丨10分钟阅读 摘要&#xff1a;软银&#xff08;SoftBank&#xff09;先进技术研究所正在积极推进量子计算商业应用&#xff0c;借助与…

在CentOS 8上卸载与安装MySQL 8的详细步骤

关键词&#xff1a;MySQL 8安装、CentOS 8、YUM源配置、卸载MySQL、MySQL残留文件删除、首次登录MySQL临时密码、服务状态检查、MySQL社区服务器 阅读建议&#xff1a;本文适合需要在CentOS 8操作系统上部署最新MySQL 8数据库的系统管理员或开发者阅读。文中步骤简洁清晰&#…