为什么数组下标能访问指针指向的字符串

代码在这里,谢谢各位大神谢谢谢谢谢谢图片

C语言天然支持对指针用下标形式的写法(a[i]相当于a + i,你甚至可以很变态地写i[a],从语法上说不通,i又不是数组,但是如果你理解a[i]其实就是a+i,那么i[a]其实就是i+a,所以两个写法都可以)
这里天然地读取常量区的字符串中的字符,当然没问题,printf调用的时候,肯定是把a[i]又拷贝了一份到堆栈上。
不能写的是a[i] = xxx,因为a是常量。

一个是常量区一个是栈区为什么可以相互转化?

a[i]=*(a+i),a指向常量区中的字符串手首地址,char a是在栈中开辟了一个四个字节的内存,里面存的是字符串的首地址,a+i是指首地址后向后移动sizeof(char)*i个字节,即a+i指向常量区中字符串中的第二个字符,表示寻址取值,则*(a+i)表示读取 指针a+i 表示的地址内的值

数组是存储在一串连续的内存当中的,指针默认指向的是首地址,指针加1就相当于下一个内存地址,由于数组是连续内存,所以和下标得到的结果是一样的

这是语法问题,这种东西你记住就行了,就跟告诉你一加一是二,三减一也是二,你非要去探讨为什么没有意义。

这是硬件提供给编程语言的指令,而编程语言则提供人性化语法供给程序员学习。如果你想知道如何实现,你需要去学习底层知识