1)指针的算术
将一个整型变量加1后,其值将增加1。
但是,将指针变量(地址的值)加1后,增加的量等于它指向的数据类型的字节数。
2)数组的地址
a)数组在内存中占用的空间是连续的。
b)C++将数组名解释为数组第0个元素的地址。
c)数组第0个元素的地址和数组首地址的取值是相同的。
d)数组第n个元素的地址是:数组首地址+n
e)C++编译器把 数组名[下标] 解释为 *(数组首地址+下标)
3)数组的本质
数组是占用连续空间的一块内存,数组名被解释为数组第0个元素的地址。C++操作这块内存有两种方法:数组解释法和指针表示法,它们是等价的。
4)数组名不一定会被解释为地址
在多数情况下,C++将数组名解释为数组的第0个元素的地址,但是,将sizeof运算符用于数据名时,将返回整个数组占用内存空间的字节数。
可以修改指针的值,但数组名是常量,不可修改。
示例:
#include <iostream>
using namespace std;
int main() {
// 定义一个整型数组
int arr[] = {10, 20, 30, 40, 50};
// 显示数组的大小
cout << "数组大小: " << sizeof(arr) << " 字节" << endl;
// 通过数组名获取数组第0个元素的地址
cout << "数组名作为地址: " << arr << endl;
// 通过指针访问数组元素
int* ptr = arr; // 数组名是第0个元素的地址
cout << "通过指针访问第一个元素: " << *ptr << endl;
// 指针加1
ptr++;
cout << "通过指针访问第二个元素: " << *ptr << endl;
// 数组的地址操作
cout << "数组第0个元素的地址: " << &arr[0] << endl;
cout << "数组第1个元素的地址: " << &arr[1] << endl;
cout << "通过算术运算得到第1个元素的地址: " << arr + 1 << endl;
// 使用数组名和指针访问元素
cout << "第0个元素: " << arr[0] << " 或 " << *arr << endl;
cout << "第1个元素: " << arr[1] << " 或 " << *(arr + 1) << endl;
// sizeof用于数组名
cout << "sizeof(arr)给出整个数组的大小: " << sizeof(arr) << " 字节" << endl;
cout << "sizeof(ptr)给出指针的大小: " << sizeof(ptr) << " 字节" << endl;
return 0;
}
代码解析
- 数组大小: 使用
sizeof(arr)
可以获取整个数组占用的内存大小,这与数组中元素的数量和每个元素的大小有关。 - 数组名作为地址: 当用在表达式中时(除了
sizeof
和&
运算符),数组名代表数组首元素的地址。因此,输出arr
将显示数组第一个元素的内存地址。 - 通过指针访问数组元素: 将数组名赋给指针
ptr
,然后通过*ptr
访问第一个元素,ptr++
后,*ptr
访问第二个元素。 - 数组的地址操作: 数组的每个元素都可以通过
&arr[index]
获得其地址。arr + n
计算第n
个元素的地址,而不是字面上的加n
。 - 使用数组名和指针访问元素:
arr[1]
和*(arr + 1)
等价,都访问数组的第二个元素。 - sizeof用于数组名和指针:
sizeof(arr)
返回整个数组的大小(字节),而sizeof(ptr)
返回指针本身的大小,通常是4或8字节,具体取决于使用的是32位还是64位的系统。
通过这个示例,可以看到指针和数组在C++中的紧密联系以及它们之间操作的等价性,同时也展示了数组名和指针在sizeof
表达式中的不同行为。