数组不是指针,指针也不是数组,这是两个不同的东西,只是在某些场合下,可以进行相似的操作。
char a[10] = "Hello";
char *p = "World";
a和p在内存分别是这样的
可以看出,p是一个指针,其内容指向一个数组;a就是数组本身;
再看操作上的不同
1、对于sizeof操作符来说,char *p结果是指针大小,我的机器是8; char p[10]结果是数组大小,是10。
2、对&(取地址)操作符而言,得到的结果不一样,a = &a = &a[0],这三个数值都一样,但是类型不一样,&a是数组指针char (*)[10],&a[0]是指向第一个元素的指针,是char *; p != &p,p最为一个变量,本身需要内存存放,这个地址是p本身,&p获取p本身的地址,类型是char **,p存放的值为指向的数组首址,所以p != &p
void func(char (*p)[10]);
func(&p); // error
func(&a); // ok
3、编译器对两者的处理不同,即访问a和p(不是内容),产生的汇编不同,具体后补
为什么会说指针和数组一样呢,这是因为在指针代数运算、数组下标运算和数组作为参数传递给函数的时候,数组会退化生成指向第一个元素的指针。p[2] => *(p + 2), a[2] => *(a + 2),在这里看起来是等价的,而且还有诡异的写法3[p], 4[a]都是合法表达式,因为都会被转换成指针运算。
其实这两货没有什么区别,都是一个字符串开头地址,特别是传参数用char *p和 char p[1]完全是一样的东西,当然了,你用char *p是没有分配内存的,而char p[N]会分配N字节的内存
C++使用指针来处理数组的,所以就有了数组名是指向数组第一个元素指针的值,凡是数组的地方换为指针没问题,利用指针运算,但是,指针的地方,不一定可以换成数组处理方式,只有指针指向了数组,才可以换,所以char[]和char*就好理解了,第一个做形参的时候,表明这是数组,当然可以换成后者,但是后者做形参,得看看主调函数传的实参是不是数组指针,是的话,也可以等价互换,不然绝对不可以!