自学第十九天----深入探究数组下

3. 数组越界

数组的下标是有范围限制的。

数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。

所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。

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

所以我们写代码时,最好自己做越界的检查。

#include <stdio.h>int main(){int arr[10] = {1,2,3,4,5,6,7,8,9,10};int i = 0;for(i=0; i<=10; i++){printf("%d\n", arr[i]);//当i等于10的时候,越界访问了}return 0;}

看看结果: 

当数组越界时打印出来的就是《不知道啥了》 

ps:二维数组的行和列也可能存在越界。

 4. 数组作为函数参数

往往我们在写代码的时候,会将数组作为参数传个函数,

比如一个非常经典的例子:实现一个冒泡排序函数将一个整形数组排序。

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

相信大多数人第一次设计都会将数组和变量一样使用

然后发现怎么运行都不对

就像这样:

#include <stdio.h>void bubble_sort(int arr[]){int sz = sizeof(arr);
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);
for(i=0; i<sizeof(arr); i++){printf("%d ", arr[i]);}
return 0;
}

然后发现一大堆错误

调试之后可以看到 bubble_sort 函数内部的sz 是1

所以得出结论数组作为函数参数的时候,不是把整个数组的传递过去

 4.2 数组名是什么?

首先的首先,我们要知道数组名在一些情况下不是代表整个数组

用这一段代码可以总结一些规律

#include <stdio.h>int main(){int arr[10] = {1,2,3,4,5};printf("%p\n", arr);printf("%p\n", &arr[0]);printf("%d\n", *arr);
return 0;}

结果如图 

根据输出结果我们可以得出结论

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

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

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

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

知道了这些我们可以重新设计了

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

所以即使在函数参数部分写成数组的形式: int arr[] 表示的依然是一个指针:

那么,函数内部的 sizeof(arr) 结果是4。

1.  在 bubble_sort 函数中,我们使用了 sizeof(arr) 来获取数组的大小。然而,对于函数参数来说,数组会被转换为指针,因此 sizeof(arr) 实际上只会返回指针的大小,而不是数组的大小。我们需要将数组的大小作为函数参数传递给 bubble_sort 函数。

2.  在主函数中,我们使用了 for(i=0; i<sizeof(arr); i++) 来遍历数组并输出排序结果。同样地,sizeof(arr) 不会返回数组的大小,而是返回指针的大小。我们需要将数组的大小保存在一个变量中,并在循环中使用该变量来控制遍历的次数。

这是修正后的:

#include <stdio.h>void bubble_sort(int arr[], int size) {int i, j;for (i = 0; i < size - 1; i++) {for (j = 0; j < size - 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 size = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, size);for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}return 0;
}

大功告成! 

 

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

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

相关文章

IDEA的常见代码模板的使用

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试&#xff08;Debug&#xff09; 第七章 …

Matlab学习笔记1

画点 x[-1, -1, 1, 1, -1, 0] y[-1, 1, 1, -1, -1, 0] % r是颜色&#xff0c; o是点的形状 plot(x, y, ro) % 画线 plot(x, y, r)求最大最小值 x[-1, -1, 1, 1, -1, 0] y[-1, 1, 1, -1, -1, 0] % -1 min(y) % 1 max(x)计算二维旋转矩阵 dcm angle2dcm(z_angle, y_angle, …

几种典型的锁

互斥锁&#xff1a;互斥锁是一种最常见的锁类型&#xff0c;用于实现互斥访问共享资源。在任何时刻&#xff0c;只有一个线程可以持有互斥锁&#xff0c;其他线程必须等待直到锁被释放。这确保了同一时间只有一个线程能够访问被保护的资源。自旋锁&#xff1a;自旋锁是一种同步…

上海凯百斯纳米受邀盛装亮相2024第13届上海国际生物发酵展

凯百斯纳米技术&#xff08;上海&#xff09;有限公司专注于高压均质、破碎、乳化、分散、粉碎等解决方案&#xff01;E7馆B08展位与您相约&#xff01; 2024第13届国际生物发酵产品与技术装备展览会&#xff08;上海&#xff09;于8月7-9日在上海新国际博览中心盛大召开&…

[解决方法]Request failed with status code 500错误之一

在写项目时访问后端api时我的axios拦截器进入了错误 然后去浏览器搜索&#xff0c;但是大部分都是因为axios参数或参数格式问题导致的&#xff0c;然而在访问api的编写没有任何问题&#xff0c;后来我反复检查&#xff0c;发现是我写前后端写混了&#xff0c;我把express的 Co…

<数据集>钢铁缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1800张 标注数量(xml文件个数)&#xff1a;1800 标注数量(txt文件个数)&#xff1a;1800 标注类别数&#xff1a;6 标注类别名称&#xff1a;[crazing, patches, inclusion, pitted_surface, rolled-in_scale, scr…

视频共享融合赋能平台LntonCVS视频监控管理平台视频云解决方案

LntonCVS是基于国家标准GB28181协议开发的视频监控与云服务平台&#xff0c;支持多设备同时接入。该平台能够处理和分发多种视频流格式&#xff0c;包括RTSP、RTMP、FLV、HLS和WebRTC。主要功能包括视频直播监控、云端录像与存储、检索回放、智能告警、语音对讲和平台级联&…

oracle数据文件损坏和误删dbf文件处理方法

加油&#xff0c;新时代打工人&#xff01; 打开sqlplus sqlplus> “/as sysdba” &#xff08;命令行登录sqlplus&#xff09; SQL>shutdown abort; &#xff08;关闭oracle数据库服务器&#xff09; SQL>startup mount ;&#xff08;挂载oracle数据库&#xff0c;这…

WordPress外贸建站案例

Vicuna维楚纳wordpress外贸主题 Vicuna维楚纳wordpress外贸主题&#xff0c;适合跨境电商产品展示的wordpress外贸建站模板。 https://www.jianzhanpress.com/?p7132 Der德尔wordpress建站主题 经典中国红红色wordpress主题&#xff0c;适合跨境电商产业园企业建站的wordpr…

《昇思25天学习打卡营第21天|Pix2Pix实现图像转换》

Pix2Pix 是一种图像转换模型&#xff0c;使用条件生成对抗网络&#xff08;Conditional Generative Adversarial Networks&#xff0c;cGANs&#xff09;实现图像到图像的转换。它主要由生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;…

Ubuntu Desktop Docker 配置代理

Ubuntu Desktop Docker 配置代理 主要解决 docker pull 拉取不了镜像问题. Docker Desktop 配置代理 这个比较简单, 直接在 Docker Desktop 里设置 Proxies, 示例如下: http://127.0.0.1:7890 Docker Engine 配置代理 1.Docker Engine 使用下面配置文件即可, root 用户可…

Java常用类库

文章目录 概述Java 常用类库Hutool 概述 Java有着丰富的类库生态系统&#xff0c;涵盖了几乎所有的编程需求。以下是一些常用的Java类库&#xff0c;它们按功能分类&#xff0c;包括核心库、Web开发、数据库操作、JSON处理、XML处理、日志、测试等。 核心类库 Apache Commons…

B树(B-Tree)详解

B树&#xff08;B-Tree&#xff09;详解 B树&#xff08;B-Tree&#xff09;是一种自平衡的树状数据结构&#xff0c;专为磁盘和其他直接访问的辅助存储设备而设计&#xff0c;广泛应用于数据库和文件系统中。B树通过减少磁盘I/O操作的次数&#xff0c;显著提高了数据存取的效…

Eclipse 创建 XML 文件

Eclipse 创建 XML 文件 Eclipse 是一个广泛使用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了强大的工具和功能来支持各种编程语言和技术的开发。在本文中&#xff0c;我们将探讨如何在 Eclipse 中创建 XML 文件&#xff0c;以及如何利用 Eclipse 的特性来提…

Jvm基础(一)

目录 JVM是什么运行时数据区域线程私有1.程序计数器2.虚拟机栈3.本地方法栈 线程共享1.方法区2.堆 二、对象创建1.给对象分配空间(1)指针碰撞(2)空闲列表 2.对象的内存布局对象的组成Mark Word类型指针实例数据&#xff1a;对齐填充 对象的访问定位句柄法 三、垃圾收集器和内存…

Python基础知识——(005)

文章目录 P21——20. 比较运算符 P22——21. 逻辑运算符 P23——22. 位运算和运算符的优先级 P24——23. 本章总结和章节习题 P21——20. 比较运算符 示例3-17—比较运算符的使用&#xff1a; P22——21. 逻辑运算符 示例3-18—逻辑运算符的使用&#xff1a; print(True and T…

【C语言】逗号运算符详解 - 《不起眼的 “逗号”》

目录 C语言逗号运算符详解1. 逗号运算符的定义1.1 基本语法1.2 执行顺序 2. 逗号运算符的用法2.1 用于循环2.1.1 示例 2.2 用于表达式组合2.2.1 示例 3. 逗号运算符的应用场景3.1 宏定义3.1.1 示例 3.2 条件运算符中的应用3.2.1 示例 4. 总结5. 参考文献6. 结束语 C语言逗号运算…

UBUNTU22 安装QT5.15.2 记录

安装QT预置安装软件包 sudo apt install gcc sudo apt install g sudo apt install clang sudo apt install clang sudo apt install make sudo snap install cmake --classic sudo apt-get install build-essential sudo apt install libxcb-xinerama0 #安装OpenGL核心库 su…

天途无人机林业应用解决方案

林业应用现状分析 森林环境较为复杂&#xff0c;人员无法快速到达现场&#xff0c;工作人员通常会面临监控盲区&#xff0c;林区爬山涉水困难多&#xff1b;森林防火重要性不可忽视&#xff0c;2019年全国共发生森林火灾2345起&#xff0c;森林防火仍为重中之重&#xff1b;环…

go语言的基础语法

基础语法 与python、vue等类似&#xff0c;go语言也分常量和变量等&#xff0c;常量用const(不可变)和变量var(可变)定义 常量 常量中的数据类型只可以是布尔型、数字型&#xff08;整数型、浮点型和复数&#xff09;和字符串型&#xff0c;值不可更改&#xff0c;表达式只支…