C/C++中的数组名是个很奇怪的东西,它到底代表什么呢?
对于char array[n](n是一个常数),大概有这么几种语义:
<1> const char* <2> char [n] <3> char (&)[n]
举例如下(VC.NET 7.1下编译):
<1> char *p = array; // array表示const char*
<2> char (*p)[n] = &array; // array表示char [n]
<3> char (&p)[n] = array; // array表示 char (&)[n]
<4> void foo(char a[n]);
foo(array); // array表示const char*
<5> void foo(char (&a)[n]);
foo(array); // array表示char (&)[n]
<6> void foo(char (*a)[n]);
foo(&array); // array表示 char [n]
<7> char *p;
array = p; // "error C2440,无法从char*转化为char [n]",
// 因此array表示char [n]
<8> char other[n];
array = other; // "error C2106, '='左操作数必须为L值",
// 因此array表示char [n]
<9> long i = 0;
(long &)array = i; //实际改变的不是array本身的值,而是它代表
// 的数组中的头4个元素(32位),
// 因此array代表的是char [n]