以char类型为例:
char a[100]; //a类型为char[100] &a类型为 char (*)[100] *a类型为char
char *p = a; //p类型为 char*, *p类型为char。 也可以写成char *p = &a; 类型char[100]和char (*)[100]可隐式到char*转化,指向第一个元素的地址。不包含隐式转换的写法应该:char *p = &a[0]; 而它们的区别:
再看
#include <iostream> void test(char *p) //即使形参为char p[]或char p[100] { //p类型为char *,一指针类型。即使传递的实参类型是char[100],也会退化到char* std::cout << sizeof(p) << std::endl; //编译时计算,指针大小为4 p[0] = 'z'; } int main() { char a[100] = "abcdef"; test(a); std::cout << a << endl;//"zbcdef" return 0; }
要想test函数里sizeof正确输出大小,test函数的形参可以改为char (*p)[100]或 char (&p)[100] ,指定大小为100是必要的,因为char[100]不能转为char (&)[],char (*)[100]也不能转为char (*)[] 。那么定义a时改为char a[] = "abcdef";可不可以呢~~~不行,a的数组大小编译时计算,它的实际类型为char[7]而不是char[]
#include <iostream> void test(char (*p)[100]) { std::cout << sizeof(*p) << std::endl; //形参已经显示指定大小了,可以肯定输出100了。 (*p)[0] = 'z'; } int main() { char a[100] = "abcdef"; test(&a); std::cout << a << std::endl;//"zbcdef" return 0; }