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

数组和指针的本质差异在于内存访问方式和语义层面。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;

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


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

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

arr[2]

等价于:

*(arr + 2)

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

p[2]

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


函数传参时的行为不同

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

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

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

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

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


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

以上就是C++中数组和指针有什么

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享