当前位置:

首页 > 编程开发 > C语言数组从创建到内存存储的示例详解

C语言数组从创建到内存存储的示例详解

数组是存储相同类型元素的连续内存空间,通过下标访问。一维数组可声明并初始化,通过循环遍历。内存连续性可通过地址差值验证。二维数组在内存中按行连续存储,理解其布局对指针操作很重要。实用技巧包括计算数组长度与实现二分查找。

数组基础概念

说到编程里的数据结构,数组绝对算得上是“元老级”成员。它的核心设计很直观:在内存里找一块连续的空间,用来存放一堆类型相同的元素。每个元素都有一个从0开始编号的“门牌号”,也就是下标。想访问哪个元素?直接报上门牌号就行,速度非常快。

来看看它最基础的几种出场方式:

int arr[5];               // 先占个坑,声明一个能放5个整数的数组,但里面现在是什么值可说不准
int nums[3] = {1, 2, 3};  // 规规矩矩,声明的同时把三个值都安排得明明白白
char str[] = "hello";     // 偷个懒,让编译器自己数。注意,字符串末尾那个隐藏的‘\0’结束符也会被算进去

一维数组操作

遍历与输入输出

和数组打交道,最常干的事就是从头到尾“拜访”每一个元素。用循环配合下标,这是标准操作:

for (int i = 0; i < 5; i++) {
    scanf("%d", &arr[i]);  // 从键盘读一个数,放进arr[i]这个位置
    printf("%d ", arr[i]); // 再把刚才放进去(或者本来就在)的值打印出来看看
}

内存连续性验证

数组“内存连续”这个特性,可不是嘴上说说的。你可以亲自验证一下:

printf("%p\n", &arr[0]);  // 打印第一个元素的地址
printf("%p\n", &arr[1]);  // 打印第二个元素的地址

你会发现,这两个地址的差值,正好就是一个int类型占用的字节数(比如常见的4字节)。这就是连续存储最直接的证据。

二维数组

声明与遍历

可以把二维数组想象成一个表格,有行有列。声明和遍历时需要两层循环,一层管行,一层管列:

int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}}; // 一个2行3列的矩阵
for (int i = 0; i < 2; i++) {           // i 控制行
    for (int j = 0; j < 3; j++) {       // j 控制列
        printf("%d ", matrix[i][j]);    // 按行按列地输出每个元素
    }
}

内存布局

别看它叫“二维”数组,在内存的物理世界里,它依然是一维的、连续排布的。具体来说,是“按行优先”的顺序。什么意思呢?就是先把第一行(matrix[0][0], matrix[0][1], matrix[0][2])挨个放好,紧接着就放第二行(matrix[1][0]...)。所以,matrix[0][2]这个位置的隔壁邻居,就是matrix[1][0]。理解这一点,对后续理解指针和高级操作至关重要。

实用技巧

计算数组长度

有时候,数组作为参数传递后,在函数内部就“忘记”自己的大小了。一个经典技巧是:用整个数组占的总空间大小,除以一个元素的大小,结果就是元素个数。

int size = sizeof(arr) / sizeof(arr[0]);  // 这招对一维数组特别好用

二分查找实现

对于已经排好序的数组,二分查找是快速定位目标的利器。它的核心思想就是不断对半缩小搜索范围:

int binary_search(int arr[], int n, int target) {
    int left = 0, right = n - 1;          // 初始搜索范围是整个数组
    while (left <= right) {
        // 计算中间点,用 left + (right - left) / 2 而不是 (left+right)/2,是为了防止整数相加可能出现的溢出
        int mid = left + (right - left) / 2;
        if (arr[mid] == target) return mid;      // 找到了!
        else if (arr[mid] < target) left = mid + 1;   // 目标在右边,缩小左边界
        else right = mid - 1;                    // 目标在左边,缩小右边界
    }
    return -1; // 没找到
}

常见错误

新手玩转数组,有几个坑特别容易踩,值得警惕:

  • 下标越界:这是头号杀手。比如你声明了int arr[5],合法的下标是0到4。去访问arr[5]就是在访问未知的内存区域,后果难以预料,程序崩溃是常事。
  • 未初始化就使用:声明了int arr[10];后直接读取里面的值?这些值可能是任意残留的“垃圾数据”,逻辑必然出错。
  • 变长数组的陷阱:C语言允许用变量定义数组大小(如int arr[n]),这叫变长数组。但它有两个限制:一是不能在声明时初始化,二是并非所有编译器都支持(尤其在C++中),用之前得搞清楚环境。

应用场景

数组虽然基础,但应用场景无处不在:

  • 字符串处理:C语言中的字符串,本质就是字符数组。处理时时刻要惦记着结尾那个默默无闻的终止符‘\0’。
  • 数据批量处理:比如要处理来自几十个传感器的温度读数,或者管理游戏里上百个角色的坐标,用数组来统一存放和管理再合适不过。
  • 算法优化:正因为内存连续,CPU在访问数组时缓存命中率会很高。很多追求极致性能的算法(比如图像处理、科学计算),都会优先考虑用数组来组织数据。

说到底,吃透数组的关键,就在于理解其连续的内存布局和直接的下标访问机制。掌握了这两点,你不仅能高效地用它解决问题,更能避开那些恼人的典型错误。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 C语言
相关文章 更多
c语言编译运行后无内容显示怎么解决教程
c语言编译运行后无内容显示怎么解决教程

本文详细解析C语言程序编译成功但运行时无内容显示的常见原因,包括输出缓冲区未刷新、程序立即退出、条件分支未命中及IDE配置问题,提供针对性的代码示例和排查步骤。

C语言分支与循环语句的完全指南
C语言分支与循环语句的完全指南

C语言程序执行顺序由分支与循环语句控制。分支语句包括if-else和switch-case,用于条件判断与多路选择;循环语句包括while、do-while和for,实现重复执行。break可跳出循环,continue跳过本次剩余代码。掌握这些控制流语句是编写逻辑程序的基础。

C语言乘方怎么表示
C语言乘方怎么表示

C语言中乘方运算可通过两种方式实现:调用标准库pow()函数需包含math.h头文件,并注意其返回double类型;或直接使用**运算符(部分编译器扩展)计算底数与指数的幂,注意该运算符非C标准,需要确认编译器支持。

【关于学习编程那些事】我们需要学习的是编程,而不是编程语言!
【关于学习编程那些事】我们需要学习的是编程,而不是编程语言!

学习编程的核心是解决问题,而非掌握编程语言本身。编程语言只是工具,真正的重点在于推理、算法和逻辑。沉迷于语言学习反而会忽视编程的本质,即通过编程语言实现自动解决问题。

什么是编程,学习编程的意义是?
什么是编程,学习编程的意义是?

编程是编写程序指令,让设备按意图运行,常用Python、C等语言或Scratch图形化编程。学习编程能跟上科技时代,锻炼自学与解决问题能力,提升逻辑思维,代表行动力,推动事物前进。各司其职,编程者尽本分。

我与编程,编程予我。
我与编程,编程予我。

双非大一计科新生与编程相遇后,生活发生巨变。他通过网课、书籍、项目及竞赛,每天利用课余时间投入四小时以上练习,从零基础起步,坚持不懈。立志进入腾讯,用编程解决实际问题,实现自我价值。

过程式编程、面向对象编程、函数式编程、泛型编程、元编程
过程式编程、面向对象编程、函数式编程、泛型编程、元编程

命令式编程关注执行步骤,声明式描述目标,函数式强调无副作用。回调函数作为参数传递,可导致回调地狱,后由Promise解决。仿函数重载`operator()`,lambda更轻量。元编程生成代码,如模板、装饰器、宏,提升抽象能力。

我的C语言编程编程之路
我的C语言编程编程之路

西安工业大学电子信息工程专业大三学生,意识到自身拖延与基础薄弱,放弃考研,选择参加比特培训班学习编程,目标为明年秋招月薪过万,决心全力投入编程与英语学习。

编程简史
编程简史

计算机编程起源于二战军事用途,机器语言采用二进制,后发展为助记符的汇编语言,再诞生了C语言等高级语言,催生了众多编程语言。编程语言本质是工具,关键在于思维。

银河麒麟下怎么安装和配置C语言编译器
银河麒麟下怎么安装和配置C语言编译器

在银河麒麟系统上安装C语言编译器,需根据系统架构与网络状态选择方式。在线环境:Debian系执行sudoapt-getinstallbuild-essential,RHEL/Anolis系执行sudodnfgroupinstall"DevelopmentTools"。离线环境:从同版本机器下载依赖包,RPM包用sudorpm-ivh*.rpm,DEB包用su

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Postman macOS版
Postman macOS版
Mac

Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

Docker Desktop macOS版
Docker Desktop macOS版
Mac

Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

Android Studio macOS版
Android Studio macOS版
Mac

Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

WINDOWS 更多
PixPix 网页版
PixPix 网页版
Windows

PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。

Postman Windows版
Postman Windows版
Windows

Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

Docker Desktop Windows版
Docker Desktop Windows版
Windows

Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。