【C语言入门】指针与数组的等价性

C语言指针:从入门到精通 指针是C语言中最强大也最具挑战性的特性之一,它是理解C语言内存管理和高效编程的关键。本文将全面介绍指针的概念、用法、常见应用场景以及注意事项,帮助读者彻底掌握这一重要概念。 阅读详情

引言:为什么理解指针与数组的关系是 C 语言的核心?

C 语言被称为 “高级汇编语言”,其核心优势在于对内存的直接控制能力。而指针(Pointer)和数组(Array)是实现这种能力的关键工具。初学者常被 “指针与数组的等价性” 困扰,但理解这一关系后,你会发现 C 语言的内存操作逻辑异常清晰 ——数组是指针的语法糖,指针是数组的底层实现。

一、内存与地址:计算机的 “快递柜” 系统

要理解指针与数组,首先要理解计算机的内存模型。内存是计算机的 “数据仓库”,它被划分为无数个字节(Byte)大小的存储单元,每个单元有一个唯一的编号,称为内存地址(类似快递柜的格子编号)。

1.1 内存的最小单位:字节与地址
  • 计算机的内存可以看作一排连续的 “小格子”,每个格子是 1 字节(8 位二进制)。
  • 每个格子有一个唯一的 “门牌号”,即内存地址。地址用十六进制表示(如0x0012FF7C),本质是一个无符号整数。
  • 数据(如整数、字符)会被拆分成多个字节,存放在连续的格子中。例如,一个 32 位整数(4 字节)会占用 4 个连续的格子。
1.2 变量的本质:地址与值的绑定

当你在 C 语言中定义一个变量:

int a = 10;  // 定义一个整型变量a,值为10

编译器会做两件事:

  1. 在内存中分配 4 字节的连续空间(假设是 32 位系统)。
  2. 将这 4 字节的地址与变量名a绑定,变量的值(10)被存储在这些地址中。

此时,&a(取 a 的地址)会返回这 4 字节的第一个地址(如0x0012FF7C)。

二、指针的本质:地址的 “搬运工”

指针是 C 语言中专门用来存储内存地址的变量类型。它的定义和操作直接关联内存地址,因此被称为 “C 语言的灵魂”。

2.1 指针变量的定义与初始化

指针变量的定义格式是类型* 指针名,例如:

int a = 10;
int* p = &a;  // p是一个指向int类型的指针,存储a的地址

这里:

  • int*表示指针的类型是 “指向 int 的指针”(即它存储的地址对应的内存中存放的是 int 类型的数据)。
  • p的值是&a(a的地址,如0x0012FF7C)。
  • *p(解引用指针)表示访问p所指向地址的内容,即a的值(10)。
2.2 指针的算术运算:移动地址的 “步长”

指针支持两种算术运算:+和-,用于在内存中移动指针的位置。例如:

int arr[5] = {10, 20, 30, 40, 50};
int* p = arr;  // p指向数组的第一个元素(地址为&arr[0])
p = p + 2;     // p移动到第三个元素的地址(&arr[2])

这里的关键是:指针移动的步长由指针指向的数据类型决定。

  • int类型占 4 字节,因此p + 1会让地址增加 4 字节(p的地址 + 1*sizeof(int))。
  • 如果是char*指针(char占 1 字节),p + 1会让地址增加 1 字节。

这一特性保证了指针可以正确指向数组中的下一个元素,无论数组元素是什么类型。

三、数组的内存布局:连续存储的 “快递格”

数组是 C 语言中用于存储多个同类型数据的结构,其核心特性是内存的连续性—— 所有元素在内存中依次排列,没有间隔。

3.1 数组的定义与内存分配

定义一个数组:

int arr[5] = {10, 20, 30, 40, 50};

编译器会在内存中分配5 * sizeof(int)(20 字节)的连续空间,并将数组名arr作为这段空间的起始地址(即&arr[0])。

内存布局如下(假设起始地址为0x0012FF7C):

元素arr[0]arr[1]arr[2]arr[3]arr[4]
地址0x0012FF7C0x0012FF800x0012FF840x0012FF880x0012FF8C
内容1020304050
3.2 数组名的本质:常量指针

数组名arr在大多数情况下等价于一个指向数组首元素的常量指针(int* const arr)。这意味着:

  • arr的值是数组首元素的地址(&arr[0])。
  • arr本身不能被修改(不能重新赋值为其他地址),因为它是常量。

例如,以下代码会报错:

int arr[5] = {10, 20, 30, 40, 50};
arr = arr + 1;  // 错误!数组名是常量指针,不能修改
四、等价性核心:p[i]与*(p+i)的数学推导

现在回到核心问题:为什么p[i]等价于*(p+i)?我们可以从数学和内存地址的角度推导。

4.1 数组下标的本质:基于起始地址的偏移

当我们用arr[i]访问数组元素时,编译器会将其转换为*(arr + i)。这是因为:

  • arr是数组的起始地址(&arr[0])。
  • i是偏移量(从 0 开始计数)。
  • arr + i的地址计算为:起始地址 + i * sizeof(元素类型)。
  • *(arr + i)则是访问该地址的内容。

例如,arr[2]的地址是arr + 2*sizeof(int)(假设sizeof(int)=4),即0x0012FF7C + 8 = 0x0012FF84,对应arr[2]的值 30。

4.2 指针与数组的统一:p[i]是*(p+i)的语法糖

当指针p指向数组的起始地址(p = arr)时,p[i]和arr[i]的行为完全一致,因为:

  • p[i]会被编译器转换为*(p + i)(和数组下标访问的逻辑相同)。
  • p是变量指针,可以修改其指向的地址(与数组名不同)。

例如:

int arr[5] = {10, 20, 30, 40, 50};
int* p = arr;  // p指向arr的起始地址

// 以下写法等价
printf("%d\n", arr[2]);  // 输出30
printf("%d\n", p[2]);    // 输出30
printf("%d\n", *(arr + 2));  // 输出30
printf("%d\n", *(p + 2));    // 输出30
4.3 数学公式验证

设:

  • p的初始地址为base_addr(即arr的起始地址)。
  • 元素类型的大小为size(如int是 4 字节)。

则:

  • p + i的地址是base_addr + i * size。
  • *(p + i)是该地址的内容。
  • p[i]的语义是 “从p的地址开始,偏移i个元素后的内容”,与*(p + i)完全一致。
五、汇编验证:编译器如何处理p[i]和*(p+i)

为了彻底验证等价性,我们可以查看 C 代码对应的汇编指令。以以下代码为例:

int arr[5] = {10, 20, 30, 40, 50};
int* p = arr;
int a = arr[2];
int b = p[2];
int c = *(arr + 2);
int d = *(p + 2);

在 GCC 编译器下,上述代码的汇编输出(简化后)如下:

; 加载arr[2]到a
mov eax, DWORD PTR arr[0x8]  ; arr + 2*4 = arr + 8字节
mov DWORD PTR a[rip], eax    ; 存入变量a

; 加载p[2]到b
mov eax, DWORD PTR [p]       ; p的值是arr的起始地址
add eax, 0x8                 ; eax = p + 8字节(即p + 2*4)
mov eax, DWORD PTR [eax]     ; 取该地址的内容(30)
mov DWORD PTR b[rip], eax    ; 存入变量b

; 加载*(arr + 2)到c
mov eax, DWORD PTR arr[0x8]  ; 与arr[2]完全相同
mov DWORD PTR c[rip], eax    ; 存入变量c

; 加载*(p + 2)到d
mov eax, DWORD PTR [p]       ; p的值是arr的起始地址
add eax, 0x8                 ; eax = p + 8字节
mov eax, DWORD PTR [eax]     ; 取该地址的内容(30)
mov DWORD PTR d[rip], eax    ; 存入变量d

可以看到:

  • arr[2]和*(arr + 2)的汇编指令完全相同。
  • p[2]和*(p + 2)的汇编指令也完全相同。
  • 所有操作最终都转换为 “计算地址→读取地址内容” 的底层操作。
六、常见误区与实战技巧
误区 1:“数组名是指针变量”

数组名arr在大多数情况下等价于指针,但它是一个常量指针(int* const arr),不能被修改。例如:

int arr[5] = {10, 20, 30, 40, 50};
arr++;  // 错误!数组名不能自增

而指针变量p可以修改:

int* p = arr;
p++;  // 正确!p现在指向arr[1]
误区 2:“p[i]比*(p+i)更高效”

从汇编层面看,两者生成的机器指令完全相同,因此性能没有差异。p[i]只是*(p+i)的语法糖,目的是让代码更易读。

误区 3:“数组下标必须从 0 开始”

C 语言的数组下标本质是偏移量,因此理论上可以使用任意整数作为下标(包括负数),但需要确保地址有效。例如:

int arr[5] = {10, 20, 30, 40, 50};
int* p = &arr[2];  // p指向arr[2](地址为arr + 8)
printf("%d\n", p[-1]);  // 输出arr[1](20),等价于*(p - 1)
printf("%d\n", p[1]);   // 输出arr[3](40),等价于*(p + 1)

但这种写法容易导致数组越界(访问不存在的地址),需谨慎使用。

实战技巧:用指针优化数组操作

由于指针可以灵活移动,在处理大数组时,用指针代替数组下标可以减少重复计算地址的开销。例如,遍历数组时:

// 数组下标写法(每次计算arr + i*4)
for (int i = 0; i < 5; i++) {
    printf("%d ", arr[i]);
}

// 指针写法(p自增,无需重复计算偏移)
int* p = arr;
for (int i = 0; i < 5; i++) {
    printf("%d ", *p);
    p++;
}

两种写法效果相同,但指针写法在底层可能更高效(取决于编译器优化)。

七、历史与设计哲学:C 语言为何选择这种等价性?

C 语言由丹尼斯・里奇(Dennis Ritchie)在 20 世纪 70 年代设计,其目标是为 UNIX 系统提供一种高效、可移植的编程语言。指针与数组的等价性设计,本质上是为了保持内存操作的简洁性和高效性。

7.1 从 B 语言到 C 语言的传承

C 语言的前身是 B 语言,而 B 语言的数组访问语法是b[i],其底层实现就是*(b + i)。C 语言继承了这一设计,并明确了指针与数组的关系,使得内存操作可以像操作数学公式一样简洁。

7.2 硬件无关性与可移植性

通过将数组下标转换为指针运算,C 语言可以在不同硬件平台上(如 16 位、32 位、64 位系统)自动调整地址计算方式(根据sizeof(类型)),保证了代码的可移植性。

7.3 与机器指令的映射

指针运算直接对应机器的内存寻址指令(如 x86 的[base + index*scale]模式),因此 C 语言的代码可以高效地转换为机器码,这也是 C 语言至今仍被用于操作系统、嵌入式开发的重要原因。

八、与其他语言的对比:为何 C 语言更 “接近硬件”

大多数高级语言(如 Java、Python)隐藏了指针和内存地址的概念,数组的访问被封装为更安全的语法。但这也导致它们失去了对内存的直接控制能力。

8.1 Java 的数组:封装后的 “安全指针”

Java 的数组本质上是对象,数组名存储的是对象的引用(类似指针)。但 Java 会自动检查数组下标是否越界(抛出ArrayIndexOutOfBoundsException),因此无法像 C 语言一样通过指针运算访问非法地址。

8.2 Python 的列表:动态类型的 “超级数组”

Python 的列表(List)是动态数组,支持任意类型的元素。但 Python 的解释器完全隐藏了内存细节,用户无法直接操作地址,因此无法体验 C 语言中指针与数组的等价性。

8.3 C++ 的数组与指针:C 的延伸

C++ 完全继承了 C 语言的指针与数组机制,并新增了引用(Reference)等特性。但 C++ 的标准库(如std::vector)提供了更安全、更高效的容器,减少了直接使用原始数组和指针的需求。

九、总结:理解等价性的意义

指针与数组的等价性是 C 语言内存操作的核心逻辑。掌握这一关系后,你将能够:

  1. 更高效地编写数组操作代码(如动态内存分配、字符串处理)。
  2. 深入理解编译器的工作原理(如何将高级语法转换为底层指令)。
  3. 调试内存相关的问题(如越界访问、野指针)。
  4. 为学习数据结构(如链表、树、图)打下基础(这些结构的实现依赖指针)。

形象解释:用 “快递柜” 理解指针与数组的等价性

我们可以把电脑的内存想象成一排快递柜,每个格子都有唯一的编号(内存地址),格子里的东西是存储的数据。指针和数组的关系,就像 “快递单” 和 “连续快递格” 的关系。

1. 先认识 “快递单”(指针)

假设你有一张快递单,上面写着 “3 楼 A 区 10 号柜”(这就是指针变量,保存的是内存地址)。当你想拿到快递时,有两种方式:

  • 直接看快递单上的编号(指针保存的地址),找到对应的柜子,取出里面的东西 → 这叫解引用指针(*p)。
  • 或者,你可能说:“我要 10 号柜旁边第 2 个柜子的快递” → 这时候快递单的编号会变成10 + 2(p+2),再取出里面的东西 → 这就是*(p+2)。
2. 再认识 “连续快递格”(数组)

现在,假设你网购了 5 件衣服,快递员把它们依次放进了 “3 楼 A 区 10、11、12、13、14 号柜”(这就是数组,内存中连续的一组地址)。这时候:

  • 数组的名字arr就像这排柜子的 “起点标记”(等价于指向 10 号柜的指针)。
  • 你想拿第 3 件衣服(从 0 开始数是第 2 件),有两种说法:
    • “10 号柜旁边第 2 个柜子的衣服” → 对应代码arr[2](数组下标访问)。
    • “从起点(10 号)往后数 2 个柜子,取出里面的东西” → 对应代码*(arr + 2)(指针运算)。
3. 为什么它们等价?

因为数组的本质是连续内存,而指针是内存地址的搬运工。当指针p指向数组的起点(p = arr)时:

  • p[i]相当于 “从p的位置开始,往后数第i个柜子” → 地址是p + i。
  • *(p + i)则是直接 “取出p + i地址对应的柜子里的东西”。

就像你有一张写着 “10 号柜” 的快递单(p),想拿第 2 个柜子的快递(i=2),无论是说 “p[2]” 还是 “*(p+2)”,最终都是去 12 号柜取东西 ——结果完全一样。

 

C语言指针与数组:本质解析与高级应用 指针和数组是C语言中处理内存操作的核心概念。指针作为内存地址的抽象,赋予程序直接操作内存的能力;而数组则是连续内存空间的逻辑封装。从原理上看,数组名本质上是首元素地址的常量指针,这使得二者在访问方式、函数传参等场景下具有等价性。理解这种关系对开发高性能系统软件至关重要,特别是在嵌入式开发、操作系统内核等需要精细内存管理的领域。在实际工程中,指针与数组的混用既能实现灵活的数据结构(如动态数组、字符串处理),也可能导致数组越界、野指针等典型问题。通过掌握指针算术、多维数组访问等进阶技巧,开发者可以优化内存访问模 阅读详情

相关推荐

Tinder养号防封攻略来了:最新Tinder养号流程和运营攻略

今天,我就来给大家分享一下Tinder养号的具体操作,以及针对Tinder账号被封的一些常见问题为大家做个答疑。

m0_67768117的博客 2万+

数组与指针

数组名可看作一个指针,代表数组中0元素的地址。(只是可以看做)&a与a在数值上实现相同,但意义上不同。&a代表整体的地址,a代表个体的地址。C语言中的字符串常量的类型是char *。当指针指向数组元素,才能进行指针运算。注意组合的问题。

weixin_44310412的博客 134

点云数据增强及预处理

数据增强: 1. random world flip:沿着x或者y轴,翻转点云 点云的x或者y,要翻转 3d box中心的x或者y,要翻转 3d box的朝向要翻转 point segmentation label,点云的相对顺序没有发生变化 2. random_world_rotation:沿着点云原点,旋转点云 点,x,y,绕z轴旋转 3d box,绕z轴旋转,中心和朝向都要变化 point segmentation label,点云的相对顺序没有发生变化 3. random_world_scaling

huang_victor的博客 4011

指针和数组等价

在C语言中“指针和数组等价”到底是什么意思? 在c语言中对数组和指针的困惑多数都来自这一句话。说数组和指针“等价”并不表示他们相同,甚至也不能互换。他的意思是说数组和指针的算法定义使得可以用指针方便地访问数组或者模拟数组。换言之,正如Wayne Throop指出的,“在C语言中只是指针算术和数组下标运算等价,指针和数组是不同的”。   特别的,等价的基础来自这个关键定义:   一个T数组类型

u012987770的专栏 2541

华为自研 ERP、Oracle EBS 与 SAP 上线时系统配置思路设计差异深度分析

本文对比分析了华为自研ERP、Oracle EBS和SAP S/4HANA三大ERP系统在上线配置思路上的核心差异。从架构设计看,华为采用分布式微服务架构,SAP采用分层服务架构,Oracle采用集中式一体化架构;在模块配置上,华为以业务场景为导向,SAP基于行业模板,Oracle强调模块独立性;数据迁移方面,华为侧重业务规则清洗,SAP注重数据质量监控,Oracle依赖标准化工具;流程适配上,华为系统随流程调整,SAP在框架内优化,Oracle需定制开发;定制开发模式差异明显,华为采用插件化扩展,SAP使

金牌架构师 1453

Qt Installer Framework 简单使用

qt installer framework 简单使用

qq_42815643的博客 2576

指针和数组等价 的意思

    char c[10];     //scanf("%s",&c);     scanf("%s",c);      这两句话的作用一样,哪句都对,且结果一样。     因为数组名做参数时会退化成指针。数组名就是首地址。那么,在C语言中,“指针和数组等价”是什么意思?  说数组和指针 “等价”不表示它们相同, 甚至也不能互换。它的意思是说数组和指针的算法定义可以用指针方便的访问数

zzhangjiej的专栏 1958

【AI】获取各类AI大模型api-key的快速教程(OpenAI、Gemini、Claude、DeepSeek)

【AI】获取各类AI大模型api-key的快速教程(OpenAI、Gemini、Claude、DeepSeek)

funfan的博客 2967

C语言入门-指针2

下面详细讲解指针与数组、结构体、函数、运算的关系,就像一个房子,前面讲解了指针与砖块的直接关系,下面讲解指针工具与小柜子、大柜子、卧室等的关系。

JK_DZY的博客 461

设备接入与APP(应用程序)接入华为云iotDA平台的详细操作步骤及获取方式

设备及APP(应用程序) 登录 IoTDA 平台所需的 入场与操作清单内容,提供逐项详细操作步骤和获取方式,并穿插贴士便于理解与实际操作落地。内容基于 华为云 IoTDA 控制台 和 IAM 控制台 的实际使用路径整理。

hy行者勇哥的博客 3059

2023年全国职业院校技能大赛“信息安全管理与评估”-真题——赛题题目+答案解析

2023年全国职业院校技能大赛“信息安全管理与评估”-真题——赛题题目+答案解析

君逍遥o 6004

翁恺C语言习题深度解析:从分支循环到指针结构体的刷题指南

C语言编程入门常卡在语法与实战的断层,而分支循环、数组字符串、函数指针等基础概念正是构建编程思维的核心。理解值传递、指针运算和内存布局等原理,能帮助开发者写出更健壮的代码,避免数组越界、循环失控等常见陷阱。这些基础能力在嵌入式开发、系统编程和算法实现中具有广泛的应用价值。翁恺习题以知识点对齐和边界条件设计著称,本文围绕分支循环、数组字符串、函数指针、结构体文件等高频考点,结合刷题习惯与答案使用建议,系统梳理C语言基础进阶的实践路径。

weixin_33978044的博客 437

XYC Q8开源掌机刷第三方系统教程

分区结束后直接将各种游戏文件放入OD分区的Roms文件夹下

m0_60352504的博客 4569

【C语言】关于指针数组与数组指针详解(知识点全面)

单独使用时表示的是第 1 行数据,放在表达式中会被转换为第 1 行数据的首地址,也就是第 1 行第 0 个元素的地址,因为使用整行数据没有实际的含义,编译器遇到这种情况都会转换为指向该行第 0 个元素的指针;每一个一维数组又包含了 4 个元素,例如 arr[0] 包含 a[0][0]、a[0][1]、a[0][2]、a[0][3]。需要注意的是,字符数组 str 中存放的是字符串的首地址,不是字符串本身,字符串本身位于其他的内存区域,和字符数组是分开的。表明 p 是一个指针,它指向一个数组,数组的类型为。

lirendada的博客 4万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C语言指针与数组的深度关联及实战应用

本文深入探讨C语言中指针与数组的关联关系及实际应用。主要内容包括:1) 数组名本质是常量指针,数组下标访问等价于指针运算;2) 通过指针实现数组遍历、求和和逆序等操作案例;3) 区分指针数组(存放指针的数组)和数组指针(指向整个数组的指针)的概念差异;4) 常见问题解决方案,如避免指针越界访问和正确区分两种指针类型。掌握这些知识能帮助开发者更高效地操作数组,解决实际开发问题。

今天比昨天更努力一点! 2万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【C语言】深入理解指针(2)指针与数组的联系

【C语言】深入理解指针(2)指针与数组的潜在联系

石墨博客 2115

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C语言 一维数组与指针

那么第二组的问题出在哪里呢,如果不对*pint4加括号,打开后就会变成**(pint4+i),那么pint4指向的将不再是目标数组,所以无论怎么进行*操作都不会得到真正的数据。在指针数组中,每个成员都是一个指针变量,它可以对同类型的数据进行存储,在获得真正数据时就是要对此成员进行*操作,例如*p[1],对其进行进一步分析就会变为**(p+1),看起来就像二级指针一样。这里的as其实是数组中第零个元素,正常要写成&as[0],但是&as[0]拆: & *(as+0) ==> (as+0) ==> as。

jia_03的博客 2736

【C语言】深度剖析指针(二):指针与数组,字符,函数的深度关联

本文围绕数组与指针的关联展开,解析了数组名的一般含义与特殊情况,以及如何用指针访问数组。阐述了一维和二维数组传参本质,介绍了冒泡排序实现。还讲解了二级指针、指针数组、字符指针、数组指针、函数指针及函数指针数组的定义、初始化、使用及相关应用,如指针数组模拟二维数组、函数指针数组实现转移表简化多分支逻辑等。

记录了从0学习Java技术栈的日常 1874

C语言数组指针和指针数组

其实原因很简单,在 C 语言中,赋值符号“=”号两边的数据类型必须是相同的,如果不同,则需要显示或隐式类型转换。p1 这个定义的“=”号两边的数据类型完全一致,而 p2 这个定义的“=”号两边的数据类型就不一致了(左边的类型是指向整个数组的指针,而右边的数据类型是指向单个字符的指针),因此会提示错误信息。号和 p2 构成一个指针的定义,指针变量名为 p2,而 int 修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含 5 个指向 int 类型数据的指针,如图 1 所示,因此,它是一个指针数组。

AnChenliang_1002的博客 1374

C语言中对数组,指针,下标,的理解

# C语言中,对一维数组的指针的下标的理解 解决问题:1.数组的意义和类型 2.数组名的类型和意义 3.指向数组的指针的意义 4.指针加下标的意义 例: 一、 int a[10]; 1、a[10]是数组,其中类型是整型。 2、a是数组名,它的值是指针常量,即数组第一个元素的地址,类型取决于数组元素的类型。 此例中,a 的意义“指向int的 常量指针”。(大多数情况下,数...

w1234567465的博客 4109

C语言中的指针在数组上的应用详解

C语言中指针在数组上的应用:指针遍历数组/指针与字符串/二维数组与指针数组

使者大牙ℂypher的博客 1836

3、C语言指针专题:指针与数组

- 数组名作为指针常量 - 指针访问数组元素 - 指针与数组的等价性 - 多维数组与指针 - 指向数组的指针 (int (*ptr)[n]) - 指针数组 (int *ptr[n]) - 数组指针与指针数组的区别 - 字符数组与字符串指针

天涯雨的博客 579

从零开始学C语言系列之第八章《指针与数组》

​   以上关系表明了数组和指针的关系十分密切,可以使用指针标识数组的元素和获得元素的值。可以认为*(ar +n)的意思是“到内存的 ar 位置,然后移动n个单元检索储存在那里的值”。因为计算机的硬件指令非常依赖地址,指针在某种程度上把程序员想要传达的指令以更接近机器的方式表达。只知道地址不够,因为计算机要知道储存对象需要多少字节(即使指针指向的是标量变量,也要知道变量的类型,否则*pt 就无法正确地取回地址上的值)。​ 而*(days+index)则是该元素的值,相当于 days[index]。

铁匠匠匠的博客 1770

【C语言】数 组与指针:深度剖析与等价表达

在 C 语言中,数组和指针是两个基础但至关重要的概念。它们之间有着复杂且紧密的关系,理解数组和指针的使用方法、它们如何互相转换,能够帮助程序员写出更加高效和简洁的代码。尤其是当我们在使用数组时,如果能够熟练地运用指针的方式来访问数组元素,不仅能够提升代码的执行效率,还能够加深对 C 语言内存模型的理解。 本篇文章将详细探讨数组和指针的关系,特别是它们的互换性以及一些常见的等价表达。文章中的分析将基于以下几个方面 2025.2.7-✍95min

禅宗里有一个词叫做“因缘和合”。 所谓因缘,是指事件要发生所必须的条件。因缘和合就是当你聚集了这件事的一切条件,它就会自然而然的发生。“它就会自然而然的发生”,这种朴素而坚定的价值观让我们感到无比安心,安心到可以不用有任何担心焦虑。 1264

《C 语言指针高级指南:字符、数组、函数指针的进阶攻略》

使代码更易读、更简洁。

2403_87212593的博客 1417

C语言高级编程:数组和指针作为函数形参

测试环境: win10 x86-64 gcc: x86_64-pc-cygwin 1. 说明 1)作为函数形参时(也只有这种情况),数组与指针等同,int *p = int a[],p和a在函数内部都是指针 2)数组作为函数形参时将被转化为指向数组第一个元素的指针,无论是int a[10]还是int a[]形式的形参,在函数内部都是int *a形式指针 3)没有办法直接将数组本身...

ARM-Linux 5974
上一篇: 【C语言入门】数组元素访问的效率:缓存友好性(连续内存)
下一篇: 【C语言入门】内存布局:栈(局部变量)、堆(动态分配)、数据段(全局/静态)、代码段
Mr_-G
Mr_-G 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
博客等级 码龄6年 7917粉丝 416原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值