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

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

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

DotNetGuy发布于 2026/3/28更新于 2026/6/617 浏览
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. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • DGX Spark 部署 vLLM 与 Open WebUI 运行 Qwen3-Coder-Next-FP8(CUDA 13.0)
  • Python 与 HTML 实现爱心动态效果代码教程
  • 安卓系统Chrome内核:Android System WebView
  • XILINX FPGA以太网协议栈IP:性能与定制的完美结合
  • 深势科技 Uni-Finder 发布专利侵权判定模块,准确率提升 11.4%
  • OpenClaw 多 Agent 路由:Gateway 托管多个 AI 大脑
  • Flutter 基于 web3dart 连接以太坊构建 DApp 及 OpenHarmony 适配
  • 10 款开源 AI 视频工具:免配置开箱即用
  • Java 项目 Linux 云服务器部署指南
  • Flutter Web 开发:解决跨域(CORS)问题的方法
  • Android 集成 WebRTC 与 VAD 的 AI 辅助开发实战:从选型到性能优化
  • Python 并发编程实战:多线程、多进程与线程池
  • FastAPI:Python 高性能 Web 框架核心特性解析
  • Llama-Factory 是否支持 RLHF?现状与实践路径
  • OpenAI Whisper 语音转文本快速使用指南
  • 构建 gRPC 跨语言通信:C++ 服务端与 C# 客户端实战
  • OpenAI Whisper 语音转文本完整使用指南
  • C++ 哈希表原理与模拟实现
  • 大模型特点、应用领域及学习资源指南
  • Flutter 使用 tflite_web 在鸿蒙 Web 环境下实现 AI 推理适配

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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