C++ 数组名与指针

1. 缘起

    由一个题目引起的:问下面代码输出的是什么?

const char *psz = "hello world";
int iArr[] = {12345};  
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;
}

3. 参考资料

    C/C++数组名与指针区别深入探索    http://www.rupeng.com/forum/thread-1533-1-1.html

posted @ 2011-05-31 09:21  xiaodongrush  阅读(334)  评论(2编辑  收藏  举报