C++ 数组名与指针
1. 缘起
由一个题目引起的:问下面代码输出的是什么?
const char *psz = "hello world";
int iArr[] = {1, 2, 3, 4, 5};
cout << sizeof(psz) << endl;
cout << sizeof(iArr) << endl;
int iArr[] = {1, 2, 3, 4, 5};
cout << sizeof(psz) << endl;
cout << sizeof(iArr) << endl;
前者输出是4,输出的是psz的类型大小,即指针类型占4个字节(在win32下)。
后者输出是20,即该数组的长度。
我是直接看到这题答案的,开始没有多想,但是后来发现数组名和指针是很相像的,印象里无论是数组名和psz都指向一串地址的第一个地址啊,怎么sizeof的计算方式不同呢?
2. 实验
网上的资料说,数组名是一种实体结构,不仅仅包含数组第一个元素的首地址,还包含数组的整体长度,因此,sizeof能够得到数组的整体长度,但是一旦当数组名作为参数传递的时候,其实体特性就没了,就和指针一摸一样。
有下面实验为证:
#include <iostream>
using namespace std;
void f1(char a[]) {
cout << sizeof(a) << endl;
}
void f2(char* a) {
cout << sizeof(a) << endl;
}
int main() {
char a[] = {'5','5','5','5','5','5','5','5'};
cout << sizeof(a) << endl; // 输出8
f1(a); // 输出4
f2(a); // 输出4
char* b[100][100];
cout << sizeof(b) << endl; // 输出40000
char wait;
cin >> wait;
return 0;
}
using namespace std;
void f1(char a[]) {
cout << sizeof(a) << endl;
}
void f2(char* a) {
cout << sizeof(a) << endl;
}
int main() {
char a[] = {'5','5','5','5','5','5','5','5'};
cout << sizeof(a) << endl; // 输出8
f1(a); // 输出4
f2(a); // 输出4
char* b[100][100];
cout << sizeof(b) << endl; // 输出40000
char wait;
cin >> wait;
return 0;
}
3. 参考资料
C/C++数组名与指针区别深入探索 http://www.rupeng.com/forum/thread-1533-1-1.html