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

下期预告

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

相关推荐
石小石Orz14 分钟前
AI 正在蚕食我们的编码能力
前端·后端·算法
Zwawa1 小时前
屏幕不止一种:OLED、LCD1602字符屏、TFT/IPS图形屏和串口屏怎么用,这与TTY和PTY又有什么关系
c语言·单片机·嵌入式
Fruiticecake1 小时前
C 程序员速通现代 C++(一):lambda、std::function、移动语义与智能指针
c语言·c++
田甲2 小时前
做一款 Type-C 母座读卡器:GL3224 双卡方案实测
c语言·开发语言
民乐团扒谱机2 小时前
【微实验】NSGA-II(非支配排序遗传算法)——解决多目标优化问题的“自然选择模拟器”
linux·人工智能·算法
青少儿编程课堂2 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛
武子康4 小时前
Qwen-Drive 到底是什么:4B 级 VLM 如何成为驾驶策略底座
人工智能·算法·机器学习
zh_xuan5 小时前
LeeCode 496. 下一个更大元素I
数据结构·算法·栈·单调栈
机 _ 长5 小时前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
·present·6 小时前
CSAPP(lecture 13_02 Linking)
c语言·c++