首页 > 其他分享 >数组(详细讲解版)

数组(详细讲解版)

时间:2024-12-13 16:00:24浏览次数:9  
标签:元素 数组 int 讲解 索引 numbers 详细 printf

在C语言中,数组是一种数据结构,用于存储一组相同类型的数据。数组在内存中是连续存储的,因此可以通过索引访问每个元素。以下是C语言数组的详细讲解:


1. 数组的定义

数组是具有相同数据类型的多个数据元素的集合。每个元素通过一个索引(下标)标识。

定义语法:

<数据类型> 数组名[大小];
示例:
int numbers[5];  // 定义一个存储5个整数的数组

2. 数组的初始化

2.1 声明时初始化

在声明数组时,可以直接为其赋初值。

示例:
int numbers[5] = {1, 2, 3, 4, 5};  // 初始化数组所有元素
int values[5] = {1, 2};            // 未显式初始化的元素默认值为0
特殊情况:

省略大小,编译器根据初值数量自动推断数组大小。

int numbers[] = {10, 20, 30};  // 自动推断为大小为3的数组

2.2 动态赋值

可以先声明数组,随后逐个元素赋值。

int numbers[3];
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;

3. 访问数组元素

通过数组名和索引访问元素:

数组名[索引]
  • 索引从 0 开始。
  • 超过数组边界的索引会导致未定义行为(可能崩溃或访问其他内存)。
示例:
#include <stdio.h>

int main() {
    int numbers[3] = {10, 20, 30};
    printf("Element at index 0: %d\n", numbers[0]);  // 输出10
    printf("Element at index 1: %d\n", numbers[1]);  // 输出20
    return 0;
}

4. 数组的特点

  1. 同一类型:数组中的所有元素类型必须相同。
  2. 连续存储:数组元素在内存中是连续存储的。
  3. 固定大小:数组大小一旦定义,就不可更改(除非使用动态分配)。
  4. 随机访问:可以通过索引直接访问任意元素。

5. 数组的内存分布

假设有以下数组:

int numbers[3] = {10, 20, 30};

假设 numbers 的起始地址为 0x1000,每个 int 占用 4 字节:

索引内存地址
numbers[0]100x1000
numbers[1]200x1004
numbers[2]300x1008

通过数组名(如 numbers)可以获取数组的首地址。


6. 数组操作

6.1 遍历数组

使用循环遍历数组:

#include <stdio.h>

int main() {
    int numbers[5] = {1, 2, 3, 4, 5};
    for (int i = 0; i < 5; i++) {
        printf("Element at index %d: %d\n", i, numbers[i]);
    }
    return 0;
}

6.2 修改数组元素

直接通过索引访问并修改:

numbers[2] = 99;  // 将索引2的元素修改为99

7. 字符数组与字符串

字符数组用于存储字符串,字符串以 '\0'(空字符) 结尾。

字符数组定义:

char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

也可以直接初始化字符串:

char str[] = "Hello";  // 自动添加 '\0'

字符数组操作:

输出字符串:
#include <stdio.h>

int main() {
    char str[] = "Hello, World!";
    printf("%s\n", str);  // 输出完整字符串
    return 0;
}
遍历字符串:
#include <stdio.h>

int main() {
    char str[] = "C Programming";
    for (int i = 0; str[i] != '\0'; i++) {
        printf("Character at index %d: %c\n", i, str[i]);
    }
    return 0;
}

8. 多维数组

定义:

<数据类型> 数组名[行数][列数];
示例:
int matrix[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

访问多维数组:

通过两个索引访问:

printf("%d\n", matrix[0][1]);  // 输出2

遍历多维数组:

#include <stdio.h>

int main() {
    int matrix[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("Element at [%d][%d]: %d\n", i, j, matrix[i][j]);
        }
    }
    return 0;
}

9. 数组与指针的关系

数组名可以看作是数组首元素的指针。

示例:
#include <stdio.h>

int main() {
    int numbers[3] = {10, 20, 30};
    printf("Address of numbers: %p\n", numbers);       // 输出数组首地址
    printf("Address of numbers[0]: %p\n", &numbers[0]); // 与上述相同
    return 0;
}

可以通过指针访问数组:

int *ptr = numbers;
printf("%d\n", *(ptr + 1));  // 输出20

10. 常见问题

10.1 数组越界

访问超出数组范围的索引会导致未定义行为。

int numbers[3] = {1, 2, 3};
printf("%d\n", numbers[5]);  // 错误:越界访问

10.2 数组大小

获取数组的元素个数:

int numbers[5];
int size = sizeof(numbers) / sizeof(numbers[0]);

11. 应用示例

求数组中最大值:

#include <stdio.h>

int main() {
    int numbers[] = {10, 20, 5, 40, 30};
    int max = numbers[0];
    for (int i = 1; i < 5; i++) {
        if (numbers[i] > max) {
            max = numbers[i];
        }
    }
    printf("Maximum value: %d\n", max);
    return 0;
}

如果你对数组有更多疑问或需要具体的代码示例,欢迎提问!

标签:元素,数组,int,讲解,索引,numbers,详细,printf
From: https://blog.csdn.net/2401_88186301/article/details/144440353

相关文章

  • c函数详细讲解
    C语言中的函数是实现代码复用、模块化和提高可读性的重要工具。以下是关于C语言函数的详细讲解:1.函数的基本概念函数是一组执行特定任务的代码片段,它具有一个名称,可以被调用来执行任务。C语言中的函数分为两类:库函数:如printf()、scanf()、sqrt(),由C标准库提供。用户自定......
  • jdk1.8安装及环境配置(最新最详细教学!!!)
    jdk1.8安装:看了网上很多关于jdk1.8的安装,我觉得有时候会让人云里雾里,虽然自己可能配置成功,不过没有一套自己的思路,我结合自己的经验来说一下。jdk在windows有两种安装方式,一种是解压缩包,还有一种是点击运行安装注意两种方式选一个就行,一般选择解压缩,解压完成,然后配置环境变......
  • LeetCode:3264、K次乘运算后的最终数组I
    题目:给你一个整数数组nums,一个整数k和一个整数multiplier。你需要对nums执行k次操作,每次操作中:找到nums中的最小值x,如果存在多个最小值,选择最前面的一个。将x替换为x*multiplier。请你返回执行完k次乘运算之后,最终的nums数组。示例1:输入:num......
  • 【java毕设 python毕设 大数据毕设】基于springboot的旧物回收管理系统的设计与实现
    ✍✍计算机编程指导师⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java实战|SpringBoot/SSMPython实战项目|Django微信小程......
  • [kali] kali系统的下载及在虚拟机中详细安装过程(附有下载链接)
    前言kalilinux链接:https://pan.quark.cn/s/7b394681d7c6提取码:k9ES链接失效(可能被官方和谐)可评论或私信我重发下载压缩包后解压!!安装路径不要有中文下载完以后是一个7z压缩包,需要用解压工具解压成文件夹。比如安装bandizip[Bandzip]文件解压工具的下载及详细安......
  • [VMware] VMware 17.5.0 中文版带序号生成器(中文版)安装详细教程(附下载链接)
     前言VMware17.5.0链接:https://pan.quark.cn/s/d93b53f59b41提取码:YsF7VMWare WorkstationPro是一款虚拟机软件,在其中可以安装各种虚拟操作系统。解压下载的压缩包得到文件,可以看到有一个应用程序和一个序-号生成器双击文件里的应用程序看到如图所示的安装向......
  • [Ubuntu] linux之Ubuntu18.04的下载及在虚拟机中详细安装过程(附有下载链接)
     前言ubuntu链接:https://pan.quark.cn/s/283509d0d36e提取码:dfT1链接失效(可能被官方和谐)可评论或私信我重发下载压缩包后解压!!安装路径不要有中文下载后解压得到.iso文件,不要放在有中文路径的目录下,我这里是解压放在E盘下打开虚拟机,这里使用的是VMwareWorkstat......
  • [x64dbg] 加密与解密-x32dbg和x64dbg的下载及详细安装过程(附有下载文件)
    前言 x64dbg、x32dbg和ollydbg的分析操作区别不大夸克网盘打开x64dbg链接:https://pan.quark.cn/s/c26c156deefb提取码:Btqc链接失效(可能会被官方和谐)可评论或私信我重发下载压缩包后解压!!安装路径不要有中文解压后得到x64dbg文件打开,点击release双击x96dbg.ex......
  • SpringBoot3+Vue3+NaiveUI后台搭建详细教程 | 小蚂蚁云
     项目介绍基于SpringBoot3、SpringSecurity、MybatisPlus、Vue3、TypeScript、Vite、NaiveUI、MySQL等技术栈实现的单体前后端分离后台管理系统;后端基于Java语言采用SpringBoot3、SpringSecurity、MybatisPlus、MySQL等主流技术栈,前端基于Vue3、TypeScript、Vite等技术栈实现......
  • 【数据结构与算法图解】学习笔记(第一章)①:分析数组操作过程中的时间复杂度
    文章目录前言一、第一章:数据结构为何重要1.概念(步数,时间复杂度)【第一个理论】:书中的第一个重要理论:操作的速度,并不按时间计算,而是按`步数`计算。2,了解数组2.1通过(读取,查找,插入,删除)来分析2.1.1读取(看任意索引上的值)2.1.2查找(看数组/列表中有没有该值)2.1.3插入(往......