数组是连续内存块,指针是地址变量;数组大小固定且sizeof返回总字节,指针sizeof仅返回地址大小;数组名不可修改,指针可重新赋值;传参时数组退化为指针。

在C++中,数组和指针虽然在某些情况下可以互换使用,但它们在内存中的布局和本质完全不同。理解它们的区别有助于写出更安全、高效的代码。
数组是一块连续的内存空间,用于存储相同类型的多个元素。它的大小在编译时确定(除非是动态数组),且不能改变。
例如:
int arr[5] = {10, 20, 30, 40, 50};这段代码会在栈上分配一块能容纳5个int的空间,每个int通常占4字节,因此总共占用20字节。这些元素在内存中是紧挨着的,地址依次递增。
立即学习“C++免费学习笔记(深入)”;
假设arr的起始地址是0x1000,那么各元素的地址如下:
数组名arr本身是一个指向首元素的常量指针,即 &arr[0],不能被重新赋值。
指针是一个变量,它存储的是另一个变量的地址。指针本身也需要内存空间来保存这个地址。
例如:
int x = 42;这里ptr是一个指向int的指针,它在栈上占用一定的空间(通常是8字节,64位系统),其值是变量x的地址。
再比如:
int* dynamicArr = new int[5];此时dynamicArr是一个指针,指向堆上分配的一块连续内存,大小为5个int。这块内存的管理需要程序员手动负责。
指针的灵活性在于它可以指向不同的地址,也可以被重新赋值:
ptr = &arr[2]; // 指向数组第三个元素尽管数组名可以当作指针使用(如 arr[i] 等价于 *(arr + i)),但它不是真正的指针变量。
二维数组如 int matrix[3][4] 在内存中是按行连续存储的,总共12个int,布局像一个长数组。
而指针数组如 int* ptrArray[3] 是三个指针,每个可以指向不同位置的int或数组,它们之间不一定是连续的。
还有指向数组的指针,如 int (*p)[4] = matrix; 表示p指向一个包含4个int的数组,可用于遍历二维数组。
基本上就这些。数组是连续内存块,指针是保存地址的变量,两者在内存中的角色和行为有本质区别,混淆使用容易引发错误。理解清楚有助于掌握C++底层机制。
以上就是C++数组和指针在内存中的布局的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号