指针和数组有的书上说 完全相同,有的却说完全不相同。
那到底哪一个说的对呢? 下面我们来对比一下
char str [10] ={0};//定义一个数组里面有10个元素
char *pstr = str; //把数组首元素的地址赋给指针 -----1
char *pstr = &str; //把数组首地址赋给指针 -----2
1和2的区别
1是取得数组首元素的地址 2是取得数组的首地址
结果一样,但是含义不一样,在不执行加法操作之前看不出区别,但如果执行加法操作
1的 pstr++ 相当于 str[1];
2的 pstr++ 相当于 str[10];
直接加一个数组的长度,而不是加到下一个元素
str[10] 已经越界了
再来看下一个
char *pstr = str; /把数组首元素的地址赋给指针 -----3
char *pstr = &str[0]; /把数组首元素的地址赋给指针 -----4
3和4等价
3是取得数组首元素的地址 4也是取得数组首元素的地址
char *pstr = &str[0]; -----5
char *pstr = &str; -----6
5和6的区别 同理1和2
有了以上知识储备之后 我们就会知道
执行完这一句char *pstr = str; 之后
str[1] ; 就会
等价于 *(str+1); 等价于 *(&str[0]+1);
等价于 *(pstr+1); 等价于 pstr[1] ;
都是跳转到 数组的第二个元素,从这个角度来理解 数组和指针等价
但是和它却不同
str [1](加到下一个元素) ≠ *(&str+1) (直接加一个数组的长度)
因为 &str代表一个数组的地址 str 和 &str[0]代表数组首元素的地址
那么指针和数组到底相同还是不相同呢?