在大学里一直认为数组名是指针,现在看来似乎有些站不住脚,最明显就是sizeof的结果:
char arr[8];
在这里,sizeof(arr)的结果是8,而在32位PC中,指针的长度应该是4才对。
但是可以有这样的操作:
char* p = arr;
可以把数组赋值给指针,数组名又好像指针一样
从本质来讲,数组应该是连续的一段存储空间,个人觉得C#和Java的数组声明方法更直观一些:
char[] arr = new char[8];
注:这个是堆内存分配,因为C#和Java数组是存在堆里面的。
把数组赋值给指针这样的操作,我想大概是编译器做了某些手脚,并不是真的数组赋值。
在char* p = arr;这样的操作里,数组会被编译器转为常量指针。
而数组之间是不能直接赋值的。比如:
char a1[10] = "Hello";
char a2[10] = a1; //错误
有一个函数:
void Foo(char[] arr)
{ cout<<sizeof(arr)<<end;}
如果把上面的a1传进去,结果将会是4,也就是说把数组传入函数内部,它同样会被自动转为指针。
因为数组在语法上不支持拷贝,只支持转指针,
这样也是为什么数组不能直接被作为返回值的原因