0

0

C++中数组和指针有什么区别 解析内存访问方式的本质差异

P粉602998670

P粉602998670

发布时间:2025-07-05 11:26:01

|

536人浏览过

|

来源于php中文网

原创

数组和指针的本质差异在于内存访问方式和语义层面。1.数组是静态分配的连续内存块,不能被重新赋值,位置固定;2.指针是保存地址的变量,可指向不同内存区域,支持动态内存分配;3.数组访问通过基地址+偏移量实现,效率更高,而指针访问需先取地址再访问内容,属于间接寻址;4.数组传参时会退化为指针,导致无法直接获取数组大小,需额外传递长度参数。理解这些区别有助于编写更高效、安全的c++++代码。

C++中数组和指针有什么区别 解析内存访问方式的本质差异

在C++中,数组和指针看起来很像,尤其是在某些用法上可以互换。但它们的本质差异在于内存访问方式和语义层面的不同。理解这些差异,能帮助你写出更高效、安全的代码。

C++中数组和指针有什么区别 解析内存访问方式的本质差异

数组是静态分配的连续内存块

当你声明一个数组时,比如:

C++中数组和指针有什么区别 解析内存访问方式的本质差异
int arr[5] = {1, 2, 3, 4, 5};

编译器会在栈上为这5个整型元素分配连续的内存空间,并且这块内存的大小是固定的。数组名 arr 实际上代表的是这段内存的起始地址,但它不是一个变量,不能被重新赋值。

立即学习C++免费学习笔记(深入)”;

也就是说,你不能写成:

C++中数组和指针有什么区别 解析内存访问方式的本质差异
int arr2[5];
arr = arr2; // 错误!数组名不能作为左值

数组一旦定义,它的位置就固定了,不能改变指向。


指针是一个变量,保存地址

相比之下,指针是一个变量,它保存的是某个内存地址。你可以让它指向不同的地方:

int* p = arr;   // p 指向 arr 的第一个元素
p = &arr[2];    // 现在 p 指向第三个元素

甚至你可以动态分配内存给指针使用:

int* p = new int[10];  // 在堆上分配10个整数的空间
// 使用完记得释放
delete[] p;

指针灵活但也容易出错,比如忘记释放内存导致泄漏,或者访问非法地址造成崩溃。

DeepL
DeepL

DeepL是一款强大的在线AI翻译工具,可以翻译31种不同语言的文本,并可以处理PDF、Word、PowerPoint等文档文件

下载

内存访问方式:数组更“直接”,指针更“间接”

数组访问元素是通过基地址 + 偏移量的方式进行的,这个过程在编译期就能确定,效率很高。例如:

arr[2]

等价于:

*(arr + 2)

而指针访问元素虽然形式一样:

p[2]

但背后是先取指针变量的值(也就是地址),再去访问那个地址的内容,属于间接寻址。这种灵活性是以牺牲一点性能为代价的(虽然现代编译器优化后差别不大)。


函数传参时的行为不同

这一点特别重要。当你把数组作为参数传递给函数时,它会退化为指针

void func(int arr[]) {
    // 这里的 arr 实际上是个 int*
}

所以在这个函数里,sizeof(arr) 得到的是指针的大小,而不是整个数组的大小。如果你需要知道数组长度,必须额外传一个参数进去:

void func(int* arr, int size) {
    // 使用 arr 和 size
}

这也是为什么很多新手在处理数组时容易犯错的地方。


基本上就这些。数组和指针虽然在语法上有时可以混用,但在底层机制和行为上有本质区别。理解它们的内存访问方式,有助于你在实际编程中做出更合适的选择。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

388

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

571

2023.08.10

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

34

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

14

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

33

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

18

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

12

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

AngularJS教程
AngularJS教程

共24课时 | 2.6万人学习

XML教程
XML教程

共142课时 | 5.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号