[C][数组]详细讲解

news2024/11/27 11:48:11

目录

  • 0.何为数组?
  • 1.一维数组
    • 1.创建
    • 2.数组的初始化
    • 3.一维数组的使用
    • 4.一维数组在内存中的存储
  • 2.二维数组
    • 1.创建
    • 2.二维数组初始化
    • 3.二维数组的使用
    • 4.二维数组在内存中的存储
  • 3.数组越界
  • 4.数组作为函数参数


0.何为数组?

  • 数组是一组形同类型的元素
    int arr[10] = { 1, 2, 3, 4, 5};
    
  • []括起即为数组
  • 数组的每个元素都有一个下标,下标从0开始
  • 数组可以通过下标来访问
  • 从开辟空间的角度,不应该把数组认为是一个个独立的元素,应该整体开辟空间,整体释放
  • 数组只能够进行整体初始化,不能整体赋值,不能作为左值
  • 数组的元素个数,是数组类型的一部分
  • 所有的数组(n维),都可以看待成"一维数组"

1.一维数组

1.创建

  • 数组创建时,[]中要给一个常量才可以,不能使用变量
    • 在C99标准中,支持了变长数组才可以用变量
      type_t arr_name [const_n]
      // type_t 是指数组的元素类型
      // const_n 是一个常量表达式,用来指定数组的大小
      

2.数组的初始化

  • 数组的初始化:在创建数组的同时给数组的内容一些合理初始值(初始化)
    int arr1[10] = {1,2,3};
    int arr2[] = {1,2,3,4};
    int arr3[5] = {12345}char arr4[3] = {'a', 98, 'c'};
    char arr5[] = {'a','b','c'};
    char arr6[] = "abcdef";
    
  • 数组在创建的时候如果想不指定数组的确定的大小就得初始化,数组的元素个数根据初始化的内容来确定
  • 但是对于下面的代码,内存如何分配?
    char arr1[] = "abc"; // size = 4
    char arr2[3] = {'a', 'b', 'c'}; // size = 3
    
  • 对于初始化,要连续初始化,中间不能有间隔,否则为错误初始化

3.一维数组的使用

  • [] -> 下标引用操作符
    int arr[10] = {0};//数组的不完全初始化
    
    //计算数组的元素个数
    int sz = sizeof(arr) / sizeof(arr[0]);
    
    //对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
    for(int i = 0; i < 10; i++)
    {
        arr[i] = i;
    }
    
  • 总结
    • 数组是使用下标来访问的,下标是从0开始的
    • 数组的大小可以通过计算得到

4.一维数组在内存中的存储

  • 数组在内存中是连续存放的
    &arr[0] = 012FFE9C
    &arr[1] = 012FFEA0
    &arr[2] = 012FFEA4
    &arr[3] = 012FFEA8
    &arr[4] = 012FFEAC
    &arr[5] = 012FFEB0
    &arr[6] = 012FFEB4
    &arr[7] = 012FFEB8
    &arr[8] = 012FFEBC
    &arr[9] = 012FFEC0
    
    请添加图片描述

2.二维数组

  • 二维数组的数组名表示首元素的地址
    • 二维数组的首元素是:第一行

1.创建

int arr[3][4];

2.二维数组初始化

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

3.二维数组的使用

  • 二维数组的使用也是通过下标的方式
    int arr[3][4] = {0};
    for(int i =0; i < 3; i++)
    {
        for(int j = 0; j < 4; j++)
        {
            arr[i][j] = i * 4 + j;
        }
    }
    

4.二维数组在内存中的存储

  • 二维数组在内存中也是连续存储的
    • 一行内部连续,跨行也是连续的
      &arr[0][0] = 005DFA48
      &arr[0][1] = 005DFA4C
      &arr[0][2] = 005DFA50
      &arr[0][3] = 005DFA54
      &arr[1][0] = 005DFA58
      &arr[1][1] = 005DFA5C
      &arr[1][2] = 005DFA60
      &arr[1][3] = 005DFA64
      
      请添加图片描述

3.数组越界

  • 数组的下标是有范围限制的
  • 数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1
  • 数组的下标如果< 0,或者> n-1,就是数组越界访问了,超出了数组合法空间的访问。
  • C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,所以写代码时,最好自己做越界的检查
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    for(int i = 0; i <= 10; i++)
    {
        printf("%d\n", arr[i]); // 当i等于10的时候,越界访问了
    }
    
  • 二维数组的行和列也可能存在越界

4.数组作为函数参数

  • 数组名是数组首元素的地址,除此两种情况之外,所有的数组名都表示数组首元素的地址
    • sizeof(数组名),计算整个数组的大小
      • sizeof内部单独放一个数组名,数组名表示整个数组
    • &数组名,取出的是数组的地址
      • &数组名,数组名表示整个数组
  • 当数组传参的时候,实际上只是把数组的首元素的地址传过去了
    • 所以即使在函数参数部分写成数组的形式int arr[],表示的依然是一个指针int *arr
  • 数组传参,发生降维,降维成指针
    • 为什么要降维?
      • 如果不降维,就要发生数组拷贝,函数调用效率降低,降维成指针
    • 降维成什么?
      • 所有的数组,传参都会降维成指针,降维成为指向其内部元素类型的指针
  • 在C中,任何函数调用,只要有形参实例化,必定形成临时拷贝

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

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

相关文章

数据结构的希尔排序(c语言版)

一.希尔排序的概念 1.希尔排序的基本思想 希尔排序是一种基于插入排序算法的优化排序方法。它的基本思想如下: 选择一个增量序列 t1&#xff0c;t2&#xff0c;......&#xff0c;tk&#xff0c;其中 ti > tj, 当 i < j&#xff0c;并且 tk 1。 按增量序列个数k&#…

快速复制成功模式:解读SaaS裂变工具的核心价值

在数字化快速发展的今天&#xff0c;企业如何在竞争激烈的市场中迅速站稳脚跟&#xff0c;成为许多企业家和管理者关注的焦点。SaaS裂变工具作为一种创新的解决方案&#xff0c;以其独特的优势&#xff0c;帮助企业快速复制成功模式&#xff0c;实现业务的快速增长。 SaaS裂变工…

GTD时间管理法

Part 1. What is GTD? | 什么是GTD&#xff1f; GTD is a framework that enhances focus and productivity. Through techniques such as capturing all tasks in a trusted system and breaking down complex projects into actionable items, GTD allows individuals to co…

组件的传参等

一:组件的生命周期函数 组件的生命周期函数: created只是创建了组件内的实例对象 attached,给组件实例绑定了属性,绑定到页面节点树之后 ready准备好渲染之后,还未渲染之前 moved组件实例被移动到另一个位置后执行 detached在整个组件被被移除执行 error执行的时候,组件内…

左偏树,可合并堆

合并两个堆并维护最小或最大性质解决树上节点问题&#xff0c;从叶节点往根维护&#xff0c;每个节点看作一个堆表示到最近的叶节点的距离&#xff0c;所以每次对合并&#xff08;树高矮&#xff09;表示堆的顶点对应下标关键代码 static void dfs(int x){for(int ihead[x];i&g…

科技守护,河流水文监测保障水资源安全!

中小河流是城乡水资源的补给&#xff0c;又是不可或缺的排放渠道&#xff0c;维系着城乡水资源的平衡与生态的健康。然而&#xff0c;随着工业化、城市化的快速推进&#xff0c;河流生态环境面临着越来越大的压力。为了有效保护和合理利用河流资源&#xff0c;河流水文监测成为…

2024吉林省电赛(达盛杯)

1. 电赛F4系统板3D图 提起自制STM32F407VET6系统板 2. 电赛原理图 3. 电赛PCB图 4. 智能车实物图 下图是电赛的实物图&#xff0c;结构采用3D打印 5. 软件设计 下图是程序设计图 6. 仿真视频 (1) 变化高度 2024吉林省电赛仿真1 (2) 变化轮距 2024电赛仿真2 7. APP控制小车 …

vue项目中使用json编辑器

实现效果&#xff1a; 借助插件json-editor-vue3实现效果如图一&#xff0c;如果嫌丑可以通过类名改一下样式如图二。 实现过程&#xff1a; 安装插件&#xff1a;npm install json-editor-vue3 文档链接&#xff1a;GitCode - 开发者的代码家园 <script setup name&quo…

Django 入门教程

1. Django简介 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 MVC 与 MVT 模型 MVC 模型 MVC 模式&#xff08;Model–view–controller&#xff09;是软件工程中的一种软件架构模式&#xff0c;把软件系统分为三个基本部分&#xff1a;模型&am…

NSSCTF中的pop、babyupload、cve版本签到、奇妙的MD5、easy_html

目录 [SWPUCTF 2021 新生赛]pop [NISACTF 2022]babyupload ​编辑[GKCTF 2020]cve版签到 [SWP5UCTF 2022 新生赛]奇妙的MD5 [HNCTF 2022 Week1]easy_html 今日总结&#xff1a; [SWPUCTF 2021 新生赛]pop 1.代码审计 <?phperror_reporting(0); show_source("…

文本匹配.grep与Select-String用法对比

Linux Shell与PowerShell上匹配字符串 grep与Select-String用法对比 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article…

Lin网络二

目录 根据域名查找出IP地址的流程&#xff1a; DNS域名的功能&#xff1a; 正向解析&#xff1a; 反向解析&#xff1a; DNS的端口&#xff1a; DNS域名解析工作原理&#xff1a; DNS域名解析查询方式&#xff1a; 递归查询&#xff1a;&#xff08;简单来说就是将DNS解…

ICML 2024 | 北大、字节提出新型双层位置编码方案,有效改善长度外推效果

在这项工作中&#xff0c;我们利用语言序列的内在分段特性&#xff0c;设计了一种新的位置编码方法来达到更好的长度外推效果&#xff0c;称为双层位置编码&#xff08;BiPE&#xff09;。对于每个位置&#xff0c;我们的 BiPE 融合了段内编码和段间编码。段内编码通过绝对位置…

LOTO示波器软件新增导览功能

新版本的大部分型号LOTO示波器的上位机软件我们改成了导航工具条方式。原来的方式是把所有功能都显示在不同的标签页中&#xff0c;这样的优点是非常快捷方便&#xff0c;基本上用鼠标一两次点击就能直达想要的功能设置。但是缺点是不熟练的客户可能记不住各种功能的标签位置在…

安全攻防三

一、IDS: 当黑客绕过了防火墙&#xff0c;你该如何发现&#xff1f; IDS &#xff08;Intrusion Detection System&#xff0c;入侵检测系统&#xff09; NIDS 内网中检测网络流量攻击 黑客如果已经进去内网&#xff0c;防火墙就没办法保护了 NIDS部署在交换机和路由器这些路…

曲线拟合工具软件(免费)

曲线拟合是数据处理中经常用到的数值方法,本质是使用某一个模型(方程或者方程组)将一系列离散的数据拟合成平滑的曲线或者曲面,数值求解出对应的函数参数,大家可以利用MATLAB的曲线拟合工具箱也可以使用第三方的拟合软件,今天我们介绍Welsim免费的曲线拟合软件 1、MATLA…

视频技术在智慧营业厅中的应用:AI识别与智能化转型

一、方案背景 随着信息技术的快速发展&#xff0c;图像和视频分析技术已广泛应用于各行各业&#xff0c;特别是在营业厅场景中&#xff0c;该技术能够有效提升服务质量、优化客户体验&#xff0c;并提高安全保障水平。TSINGSEE青犀智慧营业厅视频管理方案旨在探讨视频监控和视…

Kafka之【存储消息】

数据已经由生产者Producer发送给Kafka集群&#xff0c;当Kafka接收到数据后&#xff0c;会将数据写入本地文件中。 存储组件 Kafka 的消息存储涉及多个关键组件&#xff0c;每个组件在消息的存储和管理过程中扮演着特定的角色。以下是 Kafka 存储消息过程中涉及的主要存储组件及…

linux--实时性优化

linux--实时性优化 1 介绍2 实时性需求3 代表性实时系统4 嵌入式系统嵌入式软件系统结构处理器时钟节拍多任务机制任务调度方式任务调度算法时间片调度算法优先级调度算法基于优先级的时间片调度算法 5 cyclictest 测试工具命令说明 6 linux 实时性改进某版本上发布实时补丁或者…

(三)MySQL 索引

欢迎访问 什么是索引&#xff1f; 提高查询效率的一种数据结构&#xff0c;索引是数据的目录 索引的分类 按「数据结构」分类&#xff1a;Btree索引、Hash索引、Full-text索引。按「物理存储」分类&#xff1a;聚簇索引、二级索引。按「字段特性」分类&#xff1a;主键索引…