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 语言高效访问内存的核心方式

下期预告

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

相关推荐
这个DBA有点耶13 分钟前
COUNT慢不是因为用了*,是这5个原因——1000万行数据实测+执行计划深度解析
数据库·mysql·算法
贾伟康18 分钟前
【口算王|01】HarmonyOS ArkTS 口算题生成实战:按年级、运算类型和难度生成可控题目
算法·harmonyos·arkts·随机生成·口算题
lzx_00220 分钟前
C++11(一)
开发语言·c++·算法
529宝宝起名网29 分钟前
用 Python 实现名字寓意评分算法:基于 NLP 语义分析的名字内涵深度评估
python·算法·自然语言处理
未来之窗软件服务39 分钟前
计算机二级[英文]-C 字符串移动—东方仙盟
c语言·开发语言·仙盟创梦ide·东方仙盟
带多刺的玫瑰2 小时前
Leecode#26刷题之删除有序数组中的重复项
数据结构·算法·leetcode
en.en..2 小时前
C语言核心解析:#define与typedef本质区别
开发语言·c++·算法
wabs6665 小时前
关于二叉树【429.N叉树的层序遍历的思考】
数据结构·c++·算法·leetcode·二叉树
hetao17338375 小时前
2026-09-08 hetao1733837 的刷题记录
c++·算法
C++ 老炮儿的技术栈5 小时前
MFC CPtrArray的用法
开发语言·数据结构·c++·算法·mfc·c