两行代码,分别以数组形式和指针形式,先说结论。
对于字面量"he"的存放位置:
1、数组形式,字面量直接存放进栈给temp处开辟的空间
2、指针形式,字面量"he"是一个常量,在编译之初便存在于静态存储区。对于指针形式的那个字符串"he"其实是一个地址。
void square() {
char temp[]="he";
char* temp2="he";
}
实验1:较短的字符串常量初始化char[]
结论:mov语句可以看出是直接赋值,如果将字符换成"h",可以更清楚的看出赋值的是104(ASCII码)
实验2:将用于数组形式初始化的字符串增长,使用到了movabs,更加确认是直接赋值的(自行检索movabs的作用)
实验3:同时进行初始化,可以看出使用指针的形式,使用的字符串是一个在编译存放在静态区的数据,字符串即地址名
结论:其实挺好理解的,既然数组空间都开辟好了,直接将值放入就可以了。就是你有了容器,直接放元素就好。
对于指针只能存放地址,不能存放你想要的数据,所以需要从其他的地方开辟内存存放。
对于字符串常量,常量肯定是希望复用的,所以编译后就直接存放静态区了(对比java静态常量池)。c中有讲过,指针形式使用字符串,其实是开辟了一个字符数组来存放字符串,然后放回地址,即字符串等价于地址。
用js的arrow function做个简单解释
“string template”=>{char str[]=“string template”;return str}