【C初阶】第五篇——数组

news2025/1/11 18:00:23

一维数组的创建和初始化

数组的创建

数组的初始化

一维数组的使用

一维数组在内存中的存储

二维数组的创建和初始化

二维数组的创建

二维数组的初始化

二维数组的使用

二维数组在内存中的存储

数组越界

数组作为函数参数

冒泡排序函数的错误设计

数组名是什么?

冒泡排序函数的正确设计


一维数组的创建和初始化

数组的创建

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

数组的创建方式:

type_t   arr_name[const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小

举例:

//代码1
int arr1[10];
//代码2
int count = 10;
int arr2[count];//数组时候可以正常创建?
注意:此时是不可以创建的,因为count是变量,而[]内只能是常量
//代码3
char arr3[10];
float arr4[1];
double arr5[20];

注意:数组创建,在C99标准之前,[]中要给一个常量才可以,不能使用变量.在C99标准支持了变长数组的概念,即在[]中可以用变量.

数组的初始化

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)

下面是例子:

int arr1[10] = { 1,2,3 };
int arr2[] = { 1,2,3,4 };
int arr3[5] = { 1,2,3,4,5 };
char arr4[3] = { 'a',98, 'c' };
char arr5[] = { 'a','b','c' };
char arr6[] = "abcdef";

 数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。

但是对于下面的代码要区分,内容中如何分配.

char arr1[] = "abc";
char arr2[3] = { 'a','b','c' };

运行结果: 

 在arr1中,在内存中有4个数组元素,除了字符'a','b','c'之外,还有一个字符串的结束标志'\0',而在arr2中,则只有字符'a','b','c',对这两个字符串进行输出.

 注意:printf()函数对字符串进行输出的时候,当遇到'\0'即字符串的结束标志即停止输出,在arr2中,因为没有字符串的结束标志,所以会出现乱码.

总而言之,arr2的这种初始化方式没有字符串的结束标志'\0',而arr1的这种初始化方式则包含字符串的结束标志!

一维数组的使用

对于数组的使用我门之前介绍了一个操作符:[],下标引用操作符.它其实就是数组访问的操作符.

看以下代码:

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++)
	{
		arr[i] = i;
	}
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

 总结:

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

2.数组的大小可以通过计算得到。

那么我们如何求数组的个数呢?

int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);

数组的个数即是数组所占总的空间除以一个数组元素所得的值,简单举个例子来说就有点类似于总价除以单价得到商品的个数! 

一维数组在内存中的存储

接下来我们探讨数组在内存中的存储,看代码:

#include <stdio.h>
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;
}

 下面是运行结果:

仔细观察输出的结果发现,随着数组下标的增长,元素的地址,也在有规律的递增.由此我们可以得出结论:数组在内存中是连续存放的 

二维数组的创建和初始化

二维数组的创建

//数组创建
int arr[3][4];
char arr[3][5];
double arr[2][4];

二维数组的初始化

//数组初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}};//二维数组如果有初始化,行可以省略,列不能省略

二维数组的使用

二维数组的使用也是通过下标的方式.看代码:

#include <stdio.h>
int main()
{
	int arr[3][4] = { 0 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			arr[i][j] = i * 4 + j;
		}
	}
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			printf("%d ", arr[i][j]);
		}
	}
	return 0;
}

运行结果:

二维数组在内存中的存储

像一维数组一样,这里我们尝试打印二维数组的每个元素.

 通过结果我们可以分析到,其实二维数组在内存中也是连续存储的。

数组越界

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

数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1,所以数组的下标如果小于0,或者大于n-1,就会导致数组越界访问问题,超出了数组合法的空间访问.

C语言本身是不做数组下标的越界检查的,编译器也不一定会报错,但是编译器不报错,并不意味着程序就是正确的,所以程序员写代码时,最好自己做越界的检查.

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

数组作为函数参数

往往我们在写代码的时候,会将数组作为参数传给函数,比如:我要实现一个冒泡排序(这里要讲算法 思想)函数将一个整形数组排序。

那我们将会这样使用该函数:

冒泡排序函数的错误设计

//方法一:
#include <stdio.h>
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);//是否可以正常排序?
    for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

 下面是运行结果:

 很明显,方法1出问题了,并没有实现排序的目的,那我们找一下问题,调试之后可以看到 bubble_sort 函数内部的 sz ,是1。 难道数组作为函数参数的时候,不是把整个数组的传递过去?下面就要讨论一下数组名究竟代表什么!

数组名是什么?

#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.&数组名,取出的是数组的地址.&数组名,数组名表示整个数组.

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

冒泡排序函数的正确设计

当数组传参的时候,实际上只是把数组的首元素的地址传递过去了。 所以即使在函数参数部分写成数组的形式: int arr[] 表示的依然是一个指针: int *arr 。 那么,函数内部的 sizeof(arr) 结果是4。 既然方法1错了,那么冒泡排序法究竟该怎么设计?下面就是冒泡排序法的正确方法:

//方法2
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
    //代码同上面函数
}
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);//是否可以正常排序?
    for (int i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

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

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

相关文章

[附源码]Python计算机毕业设计SSM基于的汉服服装租赁系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]Python计算机毕业设计Django大学生志愿者服务管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

配置vue3适用的vue-devtools

1、下载最新的vue/devtools的github项目库 项目库地址为 &#xff1a;GitHub - vuejs/devtools: ⚙️ Browser devtools extension for debugging Vue.js applications. 2、安装yarn vue/devtools的项目库&#xff0c;必须使用yarn来编译&#xff0c;npm会报错。 npm i 会报…

SQLyog Ultimate最流行的数据库管理工具之一

SQLyog Ultimate最流行的数据库管理工具之一 SQLyog是为Windows提供的最流行的SQL数据库管理工具之一。该软件是世界上任何地方的数据库管理工具&#xff0c;非常快速&#xff0c;易于使用和维护图形环境。使用此程序&#xff0c;您可以构建漂亮的数据&#xff0c;并在可视摄像…

Java教程-特性/语法/对象和类/基本数据类型/变量修饰符运算符/循环结构和条件语句/数组/正则/文件IO/异常处理详细总结

文章目录教程简介主要特性Java 语言是简单的&#xff1a;Java 语言是面向对象的&#xff1a;Java语言是分布式的&#xff1a;Java 语言是健壮的&#xff1a;Java语言是安全的&#xff1a;Java 语言是体系结构中立的&#xff1a;Java 语言是可移植的&#xff1a;Java 语言是解释…

stm32 如何查看系统各个时钟

在主函数main中会通过定义SystemInit()函数中设置的系统时钟大小&#xff1a; SYSCLK&#xff08;系统时钟&#xff09; 72MHz AHB 总线时钟(使用 SYSCLK) 72MHz APB1 总线时钟(PCLK1) 36MHz APB2 总线时钟(PCLK2) 72MH…

消息队列---MQ介绍

文章目录前言一、MQ是什么&#xff1f;1.1基本概念1.2MQ的优势和劣势优势应用解耦异步提速削峰填谷劣势二、常见的MQ产品总结前言 实习之MQ学习历程 一、MQ是什么&#xff1f; 1.1基本概念 MQ全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系…

【数据结构】堆排序 (超详细)

前言:      前几次讲了如何构建一个堆以及TopK算法&#xff0c;那么这次给大家分享一下堆排序的两种方法。 方法一 直接暴力解决&#xff0c;建一个小堆&#xff0c;把数组的数据依次push&#xff0c;随后每次Pop堆顶&#xff0c;放进数组里。不过该方法因为建堆有消耗&…

字体图标、平面转换、渐变

1、字体图标 字体图标 字体图标展示的是图标&#xff0c;本质是字体。处理简单的、颜色单一的图片 1.1、字体图标的优点&#xff1a; 灵活性&#xff1a;灵活地修改样式&#xff0c;例如&#xff1a;尺寸、颜色等轻量级&#xff1a;体积小、渲染快、降低服务器请求次数兼容性…

SQL ALTER TABLE 语句

&#x1f4d2;博客主页&#xff1a; ​​开心档博客主页​​ &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐留言&#x1f4dd; &#x1f4cc;本文由开心档原创&#xff01; &#x1f4c6;51CTO首发时间&#xff1a;&#x1f334;2022年12月12日&#x1f334; ✉…

华硕编程竞赛11月JAVA专场 J题再见天空 题解

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

回归测试对比确认测试的区别

回归测试和确认测试是软件测试工作流程中的经常会做的两件事情&#xff0c;这两个环节也是代表软件测试的两个分类&#xff0c;那么他们之间的区别是什么&#xff1f;这篇文章咱们分析一下。回归测试与确认测试的区别&#xff1f;确认测试我们先说确认测试&#xff0c;它是软件…

表格解析 概览

表格解析发展至今&#xff0c;仍然是一项很年轻的研究领域&#xff0c;出现了大量解决方案&#xff0c;常用的技术包括&#xff1a;线检测、box检测、分割、多模态融合、GCN、img2seq。以下按我的理解梳理一下表格解析各个流派&#xff0c;从中了解这项任务背后所采用的技术。在…

28130-13-4,Val-Val-Val,H2N-VVV-OH

As trileucine, trivaline self-assembles into monolayers on highly ordered pyrolytic graphite (HOPG).三缬氨酸在高度有序的热解石墨(HOPG)上自组装成单层。 编号: 179127中文名称: 三肽Val-Val-Val英文名: Val-Val-ValCAS号: 28130-13-4单字母: H2N-VVV-OH三字母: H2N-Va…

算法:栈和队列的设计

一 用两个栈实现队列 1.1 题目描述 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead 操作返回 -1 ) 示例 1&a…

1 数据可视化简介

1.1 可视化释义 人眼是一个高带宽的巨量视觉信号输入并行处理器&#xff0c;最高带宽为每秒100MB&#xff0c;具有很强的模式识别能力&#xff0c;对可视符号的感知速度比对数字或文本快多个数量级&#xff0c;且大量的视觉信息的处理发生在潜意识阶段。其中的一个例子是视觉突…

SpringCloud2.0

一、网站架构演变过程 从传统架构(单体应用) 到 分布式架构(以项目进行拆分) 到 SOA架构(面向服务架构) 到 微服务架构 传统架构&#xff1a; 其实就是SSH或者SSM&#xff0c;属于单点应用&#xff0c;把整个业务模块都会在一个项目中进行开发&#xff0c;分为MVC架构&#…

pip install下载报网络错误、pip报错,以及module ‘serial‘ has no attribute ‘Serial‘报错

pip install下载报网络错误 下载pip install serial时报错如图&#xff1a;这是由于下载的pip官网是国外网站&#xff0c;下载速度会比较慢。 解决办法&#xff1a;从国内镜像去下载 ​ pip install serial -i https://pypi.tuna.tsinghua.edu.cn/simple或&#xff1a;sudo p…

虚拟化与云计算的区别

虚拟化和云计算之间的区别对于业务来说是至关重要和必要的。对于许多公司和专业人士来说&#xff0c;两者都是一样的。虽然云计算使用了虚拟化&#xff0c;但是虚拟化和云计算不是一回事。他们处理各种规模的 IT 挑战&#xff0c;并在对业务产生不同程度影响的不同范围内运作。…

工作很迷茫,是继续留在大城市打拼,还是回老家躺平呢?

你有没有面对这样的选择&#xff1a;是回到老家过一眼望到头的舒服简单的日子&#xff0c;还是趁年轻留在大城市拼一把&#xff0c;突破自己的舒适圈&#xff0c;挑战更多的可能性。你做了怎样的选择&#xff1f;你后悔吗&#xff1f; 什么样的人适合去大城市呢&#xff1f; 1、…