Loading... # 对 C++ 数组的一点理解 ## 数组名与指针 ### 数组指针 > 对于一个已经定义的数组,数组名是数组的指针,即数组占有的内存空间的首地址。[^1] [^1]: 摘自《C++程序设计基础(第5版)》 先看以下代码: ```cpp #include <iostream> using namespace std; int main(int argc, char** argv) { char a[2] = {'1','2'}; char* b = a; cout << "sizeof(a) = " << sizeof(a) << ", a[1]= " << a[1] << endl; cout << "sizeof(b) = " << sizeof(b) << ", b[1]= " << b[1] << endl; } ``` 输出: >sizeof(a) = 2, a[1]= 2 >sizeof(b) = 8, b[1]= 2 第六行 sizeof(a) 如期输出了char[2]的大小,而第七行则输出了char*的大小,这说明数组指针和数组关联类型的指针是不一样的。 ### 指针传递 另外一个证据是在函数参数传递上,在 C++ 中数组是不能作为参数传递的,只能传递指针 ```cpp void func(char* c) { cout << "sizeof(c) = " << sizeof(c) << ", c[1]= " << c[1] << endl; } int main(int argc, char** argv) { char a[2] = {'1','2'}; char* b = a; cout << "sizeof(a) = " << sizeof(a) << ", a[1]= " << a[1] << endl; cout << "sizeof(b) = " << sizeof(b) << ", b[1]= " << b[1] << endl; func(a); } ``` 输出: >sizeof(a) = 2, a[1]= 2 >sizeof(b) = 8, b[1]= 2 >sizeof(c) = 8, c[1]= 2 以上将数组转为指针会丢失数组的长度信息,也是一个从Java转过来不适应的地方,C++ 的隐式转换会丢失信息![^2] [^2]: 目前对数组、指针的实现还很模糊,但相信在以后学习中认识会逐渐清晰。 ## 数组大小定义 ### 不同编译器下 先看代码: ```java #include <iostream> using namespace std; int main(int argc, char** argv) { int max; cin >> max; int array[max]; int* p = array; cout << array; return 0; } ``` 这段代码在 Dev-C++(TDM-GCC 4.9.2) 下可正常编译运行得到正确的结果,但在 Visual Studio 下会得到一个C21131错误, 说明 C++ 要求数组的大小要需要为常数,即整个数组的大小需要在编译期确定。 ### 动态分配数组空间 上面实例的代码是不被推荐的,因为不同编译器处理结果可能不一样,需要大小在运行期确定的数组,我们可以使用new和delete: ```cpp #include <iostream> using namespace std; int main(int argc, char** argv) { int n; cin >> n; int* array = new int[n]; cout << sizeof(array); delete[] array; return 0; } ``` 我们可以注意到无论输入什么,输出总是: > 8 也就是 int* 的大小。这里就有一个很有意思的问题,delete 是如何确定数组的大小的? 相关讨论:https://www.zhihu.com/question/25556263 ### 关于编译器再讨论 数组大小定义的第一个例子在一些现代编译器中可以编译通过的,第二个例子中写法可能不是必须的,但我们必须注意到这种写法是有隐患的,例如在 OJ 系统可能因为这个原因程序无法通过。这里有一种简易的替代方法: ```cpp const int N = 1000; int a[N]; int main(){ int n; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; }} ``` 即先声明一个容量较大的数组,但是使用前n项。 详细的讨论可以看这里: https://blog.csdn.net/secular_/article/details/79208851 最后修改:2020 年 05 月 12 日 04 : 59 PM © 允许规范转载