C 语言从 0 入门(十二)|指针与数组:数组名本质、指针遍历数组

大家好,我是网域小星球。

上一篇我们学习了指针基础,理解了指针就是地址、&取地址、*解引用。而在 C 语言里,数组和指针关系极其紧密,甚至可以说:数组在底层就是用指针实现的。

掌握指针操作数组,不仅能让代码更简洁高效,更是理解字符串、函数传参、数据结构的关键。本篇从本质到实战层层拆解,全程 VS2022 可直接运行,零基础也能轻松掌握。

目录

一、本章学习目标

二、数组名的本质

三、核心等价公式(必背)

四、指针遍历数组(最常用写法)

[示例 1:基础遍历](#示例 1:基础遍历)

五、指针操作数组元素

[1. 修改元素](#1. 修改元素)

六、指针与字符串(重点)

七、易混概念简单区分

[1. 指针数组](#1. 指针数组)

[2. 数组指针](#2. 数组指针)

八、高频易错点

九、本章核心总结

下期预告

一、本章学习目标

学完本篇你将彻底掌握:

  1. 数组名的本质:数组名是数组首元素的地址
  2. 指针与数组通用访问规则:a[i] == *(a+i)
  3. 用指针遍历一维数组
  4. 指针操作数组元素:修改、查找、赋值
  5. 指针数组与数组指针的简单区分
  6. 高频易错点与规范写法

二、数组名的本质

一句话:数组名 = 数组首元素的地址

例如:

cpp 复制代码
int arr[5] = {10, 20, 30, 40, 50};
  • arr 等价于 &arr[0]
  • 数组名是一个常量地址,不能修改(不能 arr++)

这是指针与数组一切关系的基础。


三、核心等价公式(必背)

cpp 复制代码
arr[i]  ==  *(arr + i)

含义:

  • 数组下标访问 arr[i]
  • 本质就是指针偏移 + 解引用

所以下面两种写法完全等价:

cpp 复制代码
printf("%d", arr[2]);
printf("%d", *(arr + 2));

都表示第 3 个元素(下标 2)。


四、指针遍历数组(最常用写法)

示例 1:基础遍历

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
    int arr[5] = {1,2,3,4,5};
    int *p = arr;   // p 指向数组首地址

    for (int i = 0; i < 5; i++)
    {
        printf("%d ", *(p + i));
    }

    return 0;
}

示例 2:指针移动遍历

cpp 复制代码
int main()
{
    int arr[5] = {1,2,3,4,5};
    int *p = arr;

    for (int i = 0; i < 5; i++)
    {
        printf("%d ", *p);
        p++;    // 指针向后移动一个 int
    }

    return 0;
}

输出:

cpp 复制代码
1 2 3 4 5

五、指针操作数组元素

1. 修改元素

cpp 复制代码
int arr[5] = {1,2,3,4,5};
int *p = arr;

*(p + 2) = 300;   // 等价于 arr[2] = 300;
  1. 查找最大值
cpp 复制代码
int main()
{
    int arr[5] = {11,33,22,55,44};
    int *p = arr;
    int max = *p;

    for (int i = 1; i < 5; i++)
    {
        if (*(p+i) > max)
            max = *(p+i);
    }

    printf("max = %d\n", max);
    return 0;
}

六、指针与字符串(重点)

字符串本质是 char 数组,所以指针操作字符串非常常用。

cpp 复制代码
int main()
{
    char str[] = "hello";
    char *p = str;

    while (*p != '\0')
    {
        printf("%c", *p);
        p++;
    }

    return 0;
}

输出:

cpp 复制代码
hello

七、易混概念简单区分

1. 指针数组

存放指针的数组:

cpp 复制代码
int *arr[5];

2. 数组指针

指向数组的指针:

cpp 复制代码
int (*p)[5];

入门阶段只需记住:数组名就是首地址,用指针可以遍历数组即可。


八、高频易错点

  1. 数组名是常量地址,不能写 arr++
  2. 指针越界:偏移超过数组长度导致崩溃
  3. 混淆 *p++(*p)++*(p++)
  4. 字符串指针忘记 \0 导致乱码
  5. 把数组地址直接赋值给错误类型指针

九、本章核心总结

  1. 数组名本质:首元素地址 ,即 arr == &arr[0]
  2. 下标与指针等价:arr[i] == *(arr+i)
  3. 指针可以遍历、修改、查找数组元素
  4. 字符串用指针遍历更简洁
  5. 数组名不可修改,指针可以移动
  6. 指针 + 数组是 C 语言高效访问内存的核心方式

下期预告

下一篇我们学习结构体,学会自己定义 "复合型变量",比如学生、员工、书籍等,实现更贴近现实的数据管理,也是做小项目必备知识。

相关推荐
Tairitsu_H4 小时前
C语言:排序(一)
c语言·数据结构·排序
冰糖拌面4 小时前
二叉树遍历-递归、迭代、Morris
算法
碧海银沙音频科技研究院4 小时前
虚拟机ubuntu与windows共享文件夹(Samba共享)解决WSL加载SI工程满卡问题
人工智能·深度学习·算法
CoovallyAIHub4 小时前
ICLR 2026 | VLM自己学会调检测器:VTool-R1用强化学习教视觉模型使用工具推理
算法·架构·github
CoovallyAIHub4 小时前
RK3588上111 FPS:轻量YOLOv8+异步视频处理系统实现无人机自主电力巡检
算法·架构·github
12.=0.5 小时前
【stm32_5】Systick嘀嗒定时器、解析时钟源、分析时钟树、应用Systick设计延时
c语言·stm32·单片机·嵌入式硬件
炽烈小老头5 小时前
【每天学习一点算法 2026/04/13】两数相除
学习·算法
嘻嘻哈哈樱桃5 小时前
俄罗斯套娃信封问题力扣--354
算法·leetcode·职场和发展
田梓燊5 小时前
2026/4/12 leetcode 1320
算法·leetcode·职场和发展