什么?!指针与数组傻傻分不清?str[2]等价于2[str]嗯?关于编译器处理指针的底层逻辑
请各位小白们看这样的一个代码——
#include <stdio.h>
int main()
{
char str[] = "abc";
printf("%c\n", str[2]);
printf("%c\n", 2[str]);
return 0;
}
大家觉得对于把这句话的结果究竟是什么呢?代码错误?nono 两个的运行结果都是c。
嘻嘻,很多初学指针的人肯定不信:啊?这能一样?
接下来我贴一下在VS2020版本下运行的结果为证,虽然我是新手,我可没瞎说。图片如下
编译器可不会骗人,那么为什么完全不同的风格,结果相同,且听我娓娓道来
我们需要知道数组名的本质数组首元素的首地址(因为除了char类型存放一个元素需要的内存都大于1字节)
其次我们需要c语言编译器处理数组的底层逻辑
其实c语言编译器处理数组的时候,解应用会把str[2]等价为*(str+2)则举一反三2[str]等价为*(2+str),那么想必,如果大家学过加法交换律,那么它必然正确,这就能很好的解释为什么对c语言编译器来说str[2]等价于2[str]啦
最后关于指针的一点规则,做以补充,避免小白踩雷
c语言标准:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个指针进行比较!
那么因此面对这样的两个代码
这两个代码,都可以做到初始化数组values,那么看似第一个代码从数组的第一个元素开始初始化数组符合我们的正常逻辑,但是请你注意上面提及的c语言标准允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个指针进行比较!,因此第二种代码,更符合c语言的标准,是更好的代码风格,使我们需要学习的,谢谢大家
(声明:所有文章文字全部都是手敲,希望大家多多支持,我也一定会不断提升自己文章的质量,该观点仅来自于大一初学c语言的认知,如有错误,欢迎大家指出,也希望大家多多包涵!)
#指针##指针用法基础入门典例##数组移动##c语言##c语言基础#