数组名称实际上相当于一个指针,指向数组第一个元素所在的地址。
例1 用指针方式输入输出数组元素
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[n];
for(int i = 0; i < n; i++)
{
// 挨个赋值
// p + i表示指针的位置挪动了i * sizeof(int)个内存地址,即指向了第i个元素
cin >> *(a + i) ;
}
for(int i = 0; i < n; i++)
{
cout << *(a + i) << endl;
}
return 0;
}
运行结果:
3
10 20 30
10
20
30
分析:
在这个例子里,a既是数组名称,也代表指向第一个元素的指针。
a + 0 = a表示第一个元素a[0]的地址,a + 1表示第二个元素a[1]所在的地址。a + 2表示第三个元素a[2]的地址。
(a + 0) = a[0],(a + 1) = a[1],*(a + 2) = a[2]。
注意,这里a + 1不是表示a的地址直接加1,而是表示下一个元素的地址,即a指向的地址 + 1 * sizeof(元素类型)。
假设a[0]的地址为0x00000020,则
a = 0x00000020;
a + 1 = 0x00000020 + 1 * 4 = 0x00000024;
a + 2 = 0x00000020 + 2 * 4 = 0x00000028。
这里之所以要乘以4,是因为每个整型数据占4个字节的内存。如果是字符型数组,那么应该乘以1,如果是double型数组,那么应该乘以8。
例2:动态申请内存
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int *a = new int[n]; // 用new动态申请内存
for(int i = 0; i < n; i++)
{
cin >> *(a + i);
}
for(int i = 0; i < n; i++)
{
cout << *(a + i) << endl;
}
delete a; // 释放内存
return 0;
}
运行结果:
3
10 20 30
10
20
30
分析:
这里使用了new来申请内存,delete来释放内存。这是动态申请内存的方式。而int a[3];则是静态申请内存的方式。
动态申请内存的方式,当你使用delete释放后,这块内存就可以另做它用了。而静态申请的内存,若是为局部变量申请的内存,则等当前函数执行完后,内被释放;若是为全局变量申请的内存,则等整个程序运行结束后,内存才会被释放。
所谓“动态”,就是“随时申请,随时释放”的意思。
C++用new/delete来动态申请/释放内存,C语言则用malloc()/free()来动态申请/释放内存。