本文主要讲述c++中一维数组与指针的转换关系。在某些情况下,数组名会转化为指针。如有不当之处,请指正,谢谢!
(本文代码平台vs2013,以int类型说明,文中仅列出了关键的代码)。
//
1、当我们定义一个数组时,数组名代表的是一个数组,并非一个指针。
例1:
int a[5] = {0,1,2,3,4};
例1输出:cout << sizeof(a) << endl;
//
2、当数组名传递给一个函数的形参、作为流输出时,数组名转换为指针。
例2:
void func1(int *p1) { cout << "p1= " << p1 << " sizeof(p1) = " << sizeof(p1) << endl; } void func2(int p2[]) { cout << "p2 = " << p2 << " sizeof(p2) = " << sizeof(p2) << endl; } //------------------------------------------ int b[5] = {0,1,2,3,4}; cout << "b = " << b << " sizeof(b) = " << sizeof(b) << endl; func1(b); func2(b);
例2输出(32bits):
另外,从例2中可知,以int *p1和int p2[]形式为形参,p1、p2表示为指针。
//3、使用数组指针。
例3:
例3输出:int c[5] = { 0, 1, 2, 3, 4 }; //使用数组名输出 for (int i = 0; i < 5; ++i) cout << "c[" << i << "] = " << c[i] << " "; cout << endl; //使用指向数组的指针 int(*pc)[5] = &c; for (int i = 0; i < 5; ++i) cout << "(*pc)[" << i << "] = " << (*pc)[i] << " "; cout << endl; //int (*pc)[5] = c;//错误,不能直接使用数组名,但可以进行强制类型转换。 int(*pc1)[5] = reinterpret_cast<int(*)[5]>(c); for (int i = 0; i < 5; ++i) cout << "(*pc1)[" << i << "] = " << (*pc1)[i] << " "; cout << endl;
从例3的输出可知,数组名代表的是数组。当定义一个指向数组的指针时,须使用取地址符,且在输出数组时,须先解引用。另外,数组名可强制类型转换为数组指针(不建议这么用,此处仅演示用),然后通过解引用该
数组指针实现数组的访问。