跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C算法

C 语言指针与数组的深层关系及实战

深入解析 C 语言中数组名与指针的本质联系,涵盖数组下标等价原理、指针算术运算实战、指针数组与数组指针辨析,以及常见越界访问问题的解决方案。通过求和、逆序等案例演示指针操作数组的高效写法,帮助开发者理解内存模型,避免常见陷阱。

DotNetGuy发布于 2026/3/28更新于 2026/10/875 浏览
C 语言指针与数组的深层关系及实战

C 语言指针与数组的深层关系及实战

在 C 语言里,数组和指针的关系非常微妙,很多初学者容易混淆。其实只要理解了数组名的本质和指针算术运算,就能写出更高效的代码。这篇文章会带你从底层逻辑出发,掌握指针操作数组的核心技巧,并解决常见的越界问题。

数组名与指针的关系

数组名在大多数情况下会被编译器隐式转换为指向首元素的常量指针。这意味着 arr 和 &arr[0] 在地址上是相等的。

#include <stdio.h>
int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    printf("数组首元素地址:%p\n", arr);
    printf("数组首元素地址:%p\n", &arr[0]);
    printf("数组首元素值:%d\n", *arr);
    return 0;
}

运行结果会显示两个地址一致,且 *arr 能直接取值。不过得记住,数组名是常量指针,不能自增。像 arr++ 这种写法是非法的。

另外,下标访问 arr[i] 本质上就是 *(arr + i)。指针算术运算会根据类型自动计算偏移量,比如 int 占 4 字节,arr + 1 就会跳过 4 个字节。

指针操作数组的实战

理解了原理,我们来看看怎么用指针处理实际问题。

遍历求和

用指针遍历数组通常比下标更灵活。

#include <stdio.h>
int main() {
    int arr[6] = {1, 2, 3, 4, 5, 6};
    int sum = 0;
    int *p = arr; // 指针 p 指向数组首元素
    int len = sizeof(arr) / sizeof(arr[0]); // 计算数组长度
    for (int i = 0; i < len; i++) {
        sum += *p;
        p++; // 指针自增,指向下一个元素
    }
    printf("数组元素总和:%d\n", sum);
    return 0;
}

这里用 sizeof 算长度是个好习惯,不管数组类型怎么变都适用。

原地逆序

有时候我们需要交换数据,但又不想开辟新空间。双指针法就很合适。

#include <stdio.h>
void reverseArray(int *arr, int len) {
    int *left = arr;       // 指向数组首元素
    int *right = arr + len - 1; // 指向数组尾元素
    int temp;
    while (left < right) {
        temp = *left;
        *left = *right;
        *right = temp;
        left++;  // 左指针右移
        right--; // 右指针左移
    }
}

int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    int len = sizeof(arr) / sizeof(arr[0]);
    int *p = arr;
    
    printf("原数组:");
    for (int i = 0; i < len; i++) {
        printf("%d ", *(p + i));
    }
    printf("\n");
    
    reverseArray(arr, len);
    
    printf("逆序数组:");
    for (int i = 0; i < len; i++) {
        printf("%d ", *(p + i));
    }
    printf("\n");
    return 0;
}

注意,在函数内部传数组时,参数退化为指针,sizeof(arr) 拿到的只是指针大小,所以必须显式传递长度。

指针数组与数组指针的区别

这两个概念名字很像,但完全不一样。

指针数组

它是存放指针的数组。定义格式是 类型 *数组名 [长度]。比如存字符串列表就很方便。

#include <stdio.h>
int main() {
    char *strArr[3] = {"C 语言", "指针", "数组"};
    for (int i = 0; i < 3; i++) {
        printf("%s\n", strArr[i]);
    }
    return 0;
}
数组指针

它是指向整个数组的指针。定义格式是 类型 (*指针名)[长度]。括号不能省,否则就变成指针数组了。这在处理二维数组时特别有用。

#include <stdio.h>
int main() {
    int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int (*p)[3] = arr; // 数组指针,指向包含 3 个 int 元素的数组
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", *(*(p + i) + j));
        }
        printf("\n");
    }
    return 0;
}

常见问题与避坑

指针越界是最头疼的问题。循环次数千万别超过数组长度,否则读到随机值会很麻烦。还有,别搞混指针数组和数组指针的定义,少个括号意思全变了。

总结

数组名本质是常量指针,下标访问等价于指针解引用。指针算术运算能高效操作内存,但要注意边界检查。区分清楚指针数组和数组指针,能让你的代码更安全、更专业。

目录

  1. C 语言指针与数组的深层关系及实战
  2. 数组名与指针的关系
  3. 指针操作数组的实战
  4. 遍历求和
  5. 原地逆序
  6. 指针数组与数组指针的区别
  7. 指针数组
  8. 数组指针
  9. 常见问题与避坑
  10. 总结

更多推荐文章

查看全部
  • 插件式架构实战:基于 C++ 与 C# 的软件解耦方案
  • Mac 安装 OpenClaw 并配置飞书机器人
  • K 均值聚类算法:原理、实现与 Python 实践
  • WebView 并发初始化竞争风险分析
  • 2026 年主流网络爬虫工具对比评测与选型指南
  • Java 异常处理:从原理到实战最佳实践
  • 基于 Scrapy 的论坛帖子内容抓取实战教程
  • AIAgentWorkFlow 多智能体协作与谈判机制深度解析
  • OpenClaw 机器人免费部署与配置指南
  • 子序列 DP 实战:从基础 LIS 到二维状态转移
  • Sobel 边缘检测算法详解
  • Java 助力充电桩物联网与新能源深度融合
  • JVM 垃圾回收核心:根可达性、三色标记与 CMS/G1 对比
  • Music Tag Web 基于 Docker 的部署与管理指南
  • 利用腾讯云 HAI 与 DeepSeek 快速构建个人网页
  • Rust trait 对象执行动态分发
  • Qclaw 使用指南:基于微信的本地 AI 智能体工具入门
  • VS Code 前端开发 AI 助手体验对比:Copilot、通义灵码、iFlyCode 与 Trae
  • Flutter 三方库 modular_core 在鸿蒙系统下的适配与依赖注入实践
  • K-RagRec:基于知识图谱检索增强生成的 LLM 推荐系统

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online