数组名称实际上相当于一个指针, 指向数组第一个元素所在的地址.
例 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() 来动态申请 / 释放内存.
来源: http://www.bubuko.com/infodetail-3059523.html