06- 数组的基础知识详细讲解

news2024/11/26 9:38:27

06- 数组的基础知识详细讲解

一、基本概念

一次性定义多个相同类型的变量,并且给它们分配一片连续的内存

int arr[5];

在这里插入图片描述

1.1 初始化

只有在定义的时候赋值,才可以称为初始化。数组只有在初始化的时候才可以统一赋值。
以下是一些示例规则:

int arr[5] = {1,2,3,4,5}; // 定义并初始化数组
int arr[5] = {1,2,3}; // 可以,不完全初始化
int arr[5] = {1,2,3,4,5,6,7,8,9}; // 错误(但可以用),越界初始化,越界部分将被编译器舍弃
int arr[] = {1,2,3,4,5,6,7,8,9}; // 可以,未指定大小,但有初始化,大小为9
int arr[]; // 错误,没有指定大小也没有初始化,内存大小无法确定

注意

  • 数组在定义时必须确定其大小
  • 中括号 [] 必须有数组的大小,如果没有则必须初始化。

1.2 数组元素引用

存储模式:一片连续的内存,按照数据的类型进行分割成若干个大小相同的格子。

元素的下标与偏移量:以数组开头为基础的偏移量(数据类型大小)。
在这里插入图片描述

int arr[5] = {1,2,3,4,5}; // 定义并初始化数组

printf("arr[0]:%d\n", arr[0]); // 输出第一个元素

arr[0] = 99; // 把数组的第1个元素(偏移量为0)修改为99

printf("arr[0]:%d\n", arr[0]); // 输出修改后的第一个元素

arr[5] = 250; // "错误" 越界访问,可能造成非法访问
printf("arr[5]:%d\n", arr[5]); // 越界访问的输出

arr = {9,8,7,6,5,4}; // 错误,整体赋值只允许在初始化中
arr = 100; // 错误,数组不能整体赋值为一个值

printf("sizeof(arr):%ld\n", sizeof(arr)); // 输出数组的大小
int len = sizeof(arr) / sizeof(int); // 求数组元素的个数

for (size_t i = 0; i < len; i++) {
    printf("arr[%ld]:%d\n", i, arr[i]); // 输出每个元素
}

在这里插入图片描述

说明

  • sizeof(arr):获取数组占用的内存大小(字节数)。
  • sizeof(int):获取单个元素的大小(字节数)。
  • len:计算数组元素的个数。

注意事项

  1. 数组的下标从0开始。
  2. 越界访问数组会导致未定义行为,可能导致程序崩溃或错误结果。
  3. 数组整体赋值只能在初始化时进行,不能在定义之后进行整体赋值。

二、字符数组

概念: 专门用来存放字符类型数据的数组,称为字符数组。

2.1 初始化+引用

  1. 定义一个字符类型的数组并把’H’,‘e’,‘l’,‘l’,'o’一个一个存进去:
char ch1[5] = {'H', 'e', 'l', 'l', 'o'};
  1. 定义一个字符型的数组,并把"Hello"字符串存放到数组中,因此该数组为字符串数组:
char ch2[6] = {"Hello"};
  1. 与ch2一样,大括号可以省略:
char ch3[6] = "Hello";
  1. 修改字符数组中的某个元素:
ch3[1] = 'E'; // 可以,把数组中第二个元素‘e’修改为‘E’
  1. 整体赋值只允许在初始化时进行:
ch3 = "Even"; // 不可以,只有在初始化的时候才能整体赋值
  1. 输出字符数组:
printf("%s\n", ch1); // 在访问ch1的时候并没有发现结束符,因此很有可能会把ch2的内容一并输出

注意

  • 字符数组的结束符: ch1 为字符数组,但它没有结束符,因此在打印输出的时候应该避免使用%s 进行输出,否则可能会造成越界访问。字符串在C语言中以 \0 作为结束符,确保字符数组输出安全。
char ch1[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 加上结束符
printf("%s\n", ch1); // 现在可以安全地使用 %s 输出

2.2 示例代码

#include <stdio.h>

int main() {
    // 定义并初始化字符数组
    char ch1[5] = {'H', 'e', 'l', 'l', 'o'};
    char ch2[6] = {"Hello"};
    char ch3[6] = "Hello";

    // 修改字符数组中的某个元素
    ch3[1] = 'E';

    // 正确的打印方式
    char ch1_with_terminator[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
    printf("ch1 with terminator: %s\n", ch1_with_terminator);
    printf("ch2: %s\n", ch2);
    printf("ch3: %s\n", ch3);

    // 错误的打印方式
    printf("ch1 without terminator: %s\n", ch1); // 可能导致越界访问

    return 0;
}

总结

  • 字符数组 用来存放字符数据。
  • 初始化 时可以逐个字符赋值或使用字符串直接赋值。
  • 修改 数组元素可以通过索引访问。
  • 整体赋值 只能在初始化时进行。
  • 结束符 \0 确保字符串的安全输出。

三、数组小细节

3.1 数组未初始化

结论: 当定义数组但未初始化时,数组中的元素将包含内存中的随机值(内存中原有的内容)。

示例代码

#include <stdio.h>

int main() {
    int arr[5];
    
    // 输出未初始化的数组元素
    for (int i = 0; i < 5; i++) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }

    return 0;
}

输出: 可能会显示随机值,因为数组未初始化时,包含的是内存中的原有内容
在这里插入图片描述

3.2 部分初始化

结论: 部分初始化时,已初始化部分是已知值,未初始化的部分则为0

示例代码

#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3}; // 部分初始化,只初始化前三个元素
    
    // 输出部分初始化的数组元素
    for (int i = 0; i < 5; i++) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }

    return 0;
}

输出:

arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 0
arr[4] = 0

未初始化的元素自动设为0。

总结:

  • 未初始化数组: 包含随机值,来源于内存中的原有内容。
  • 部分初始化数组: 已初始化部分设定为指定值,未初始化部分自动设为0。

在这里插入图片描述

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

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

相关文章

Vivado 设置关联使用第三方编辑器 Notepad++

目录 1.前言2.Vivado关联外部编辑器步骤3.Notepad的一些便捷操作 微信公众号获取更多FPGA相关源码&#xff1a; 1.前言 Vivado软件自带的编辑器超级难用&#xff0c;代码高亮对比不明显&#xff0c;而且白色背景看久了眼睛痛。为了写代码时有更加舒适的体验&#xff0c;可以…

伯克希尔·哈撒韦:“股神”的“登神长阶”

股价跳水大家见过不少&#xff0c;但一秒跌掉62万美元的你见过吗&#xff1f; 今天我们来聊聊“股市”巴菲特的公司——伯克希尔哈撒韦 最近&#xff0c;由于纽交所技术故障&#xff0c;伯克希尔哈撒韦A类股股价上演一秒归“零”&#xff0c;从超过62万美元跌成185.1美元&…

《QT从基础到进阶·四十一》无法解析的外部符号及生成事件加入QT打包命令报错问题

其他无法解析的外部符号&#xff1a; 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl ML_AddinManger::metaObject(void)const "… 无法解析的外部符号 “public: virtual void * __cdecl ML_AddinManger::qt_metacast(char const *)” (?…

微信小程序毕业设计-民大食堂用餐综合服务平台系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

查看服务器端口是否打开,如何查看服务器端口是否打开

查看服务器端口是否打开&#xff0c;是确保服务器正常运行和网络通信畅通的关键步骤。以下是几个有力的方法&#xff0c;帮助你快速、准确地判断端口状态。 首先&#xff0c;你可以使用telnet命令来检测端口的连通性。telnet是一个网络协议&#xff0c;可以用于远程登录和管理网…

中国新闻网怎么投稿 新闻稿件文章如何发布到中国新闻网上,附中国新闻网价格明细

中国新闻网是中国最具影响力和权威性的新闻门户网站之一。作为广大作者和媒体从业者&#xff0c;怎样向中国新闻网投稿一直是一个备受关注的话题。在这篇文章中&#xff0c;我们将着重介绍媒介库网发稿平台&#xff0c;并分享如何在该平台上成功投稿至中国新闻网。 媒介库网发稿…

代码片段 | Matlab三维图显示[ R T 0 1] 的最佳方法

% 输入N组RT矩阵 N 4; R zeros(3, 3, N); T zeros(3, N); R(:,:,1) [-0.902608 0.250129 0.350335 ; 0.314198 0.939127 0.138996 ;-0.294242 0.235533 -0.926253 ]; T(:,1) [205.877;2796.02; 907.116];R(:,:,2) [-0.123936 0.643885 0.755018 ;0.816604 0.464468 -0.26…

Docker基础篇之本地镜像发布到阿里云

文章目录 1. 本地镜像发布到阿里云的流程2. 阿里云开发平台3. 将自己的本地镜像推送到阿里云 1. 本地镜像发布到阿里云的流程 阿里云ECS Docker生态如下图所示&#xff1a; 2. 阿里云开发平台 在控制台找到容器和镜像服务&#xff1a; 然后创建一个个人实例&#xff1a; 下面…

LeetCode 算法:合并区间c++

原题链接&#x1f517;&#xff1a;合并区间 难度&#xff1a;中等⭐️⭐️ 题目 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰…

java第二十课 —— 面向对象习题

类与对象练习题 编写类 A01&#xff0c;定义方法 max&#xff0c;实现求某个 double 数组的最大值&#xff0c;并返回。 public class Chapter7{public static void main(String[] args){A01 m new A01();double[] doubleArray null;Double res m.max(doubleArray);if(res !…

内地户口转香港身份的7种途径!2024年怎么同时拥有2个身份?一篇说明白

很多人还不知道怎么同时拥有内地身份和香港身份&#xff0c;这里一次性说明白&#xff0c;不同背景情况及政策有可能随时变化&#xff0c;这里分享最近拿香港身份的7种途径。 #01 优才『香港优秀人才计划』 获批准的申请人无须在来港定居前先获得本地雇主聘任。所有申请人均必…

搜索与图论:图中点的层次

搜索与图论&#xff1a;图中点的层次 题目描述参考代码 题目描述 输入样例 4 5 1 2 2 3 3 4 1 3 1 4输出样例 1参考代码 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 100010;int n, m; int h[N], e[N]…

【云岚到家】-day01-项目熟悉-查询区域服务开发

文章目录 1 云岚家政项目概述1.1 简介1.2 项目业务流程1.3 项目业务模块1.4 项目架构及技术栈1.5 学习后掌握能力 2 熟悉项目2.1 熟悉需求2.2 熟悉设计2.2.1 表结构2.2.2 熟悉工程结构2.2.3 jzo2o-foundations2.2.3.1 工程结构2.2.3.2 接口测试 3 开发区域服务模块3.1 流程分析…

【命令scp】Linux不同主机之间拷贝指令scp

scp可以在不同主机之间拷贝文件 # 将本地文件拷贝到远程服务器 scp a.tar changxr192.168.100.100:/home/changxr/cxr

Android——热点开关演讲稿

SoftAP打开与关闭 目录 1.三个名词的解释以及关系 Tethering——网络共享&#xff0c;WiFi热点、蓝牙、USB SoftAp——热点(无线接入点)&#xff0c;临时接入点 Hostapd——Hostapd是用于Linux系统的软件&#xff0c;&#xff0c;支持多种无线认证和加密协议&#xff0c;将任…

Visual Studio和BOM历史渊源

今天看文档无意间碰到了微软对编码格式解释&#xff0c;如下链接&#xff1a; Understanding file encoding in VS Code and PowerShell - PowerShell | Microsoft LearnConfigure file encoding in VS Code and PowerShellhttps://learn.microsoft.com/en-us/powershell/scrip…

锁存器(Latch)的产生与特点

Latch 是什么 Latch 其实就是锁存器&#xff0c;是一种在异步电路系统中&#xff0c;对输入信号电平敏感的单元&#xff0c;用来存储信息。锁存器在数据未锁存时&#xff0c;输出端的信号随输入信号变化&#xff0c;就像信号通过一个缓冲器&#xff0c;一旦锁存信号有效&#…

服务器数据恢复—raid5阵列上层XFS文件系统数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌CX4-480型号服务器存储&#xff0c;该服务器存储内有一组由20块硬盘组建的raid5磁盘阵列&#xff1b;存储空间分配了1个lun。 服务器存储故障&#xff1a; 工作人员将服务器重装操作系统后&#xff0c;未知原因导致服务器操作系统层…

项目-双人五子棋对战: websocket的讲解与使用 (1)

完整代码见: 邹锦辉个人所有代码: 测试仓库 - Gitee.com 项目介绍 接下来, 我们将制作一个关于双人五子棋的项目, 话不多说先来理清一下需求. 1.用户模块 用户的注册和登录 管理用户的天梯分数, 比赛场数, 获胜场数等信息. 2.匹配模块 依据用户的天梯积分, 实现匹配机制. 3.对…

C语言小例程8/100

题目&#xff1a;输出特殊图案&#xff0c;请在c环境中运行&#xff0c;看一看 程序分析&#xff1a;字符共有256个。不同字符&#xff0c;图形不一样。 #include<stdio.h> int main() {char a176,b219;printf("%c%c%c%c%c\n",b,a,a,a,b);printf("%c%c%c…