随笔 一
最近准备换工作,发现好多之前熟悉的点都快忘光了,都要根据基础现推,所以以后有时间就记录一下吧,也顺道锻炼一下文档写作。
事情的经过是这样的,前两天面试时,面试官问了一个关于指针和数组的问题:
作为局部变量,如下两种声明方式的区别?
void func(){
char *p = "hello world";
char a[] = "hello world";
}
我的第一反应是要问指针和数组名的区别吗?
指针p本身为一个变量,其值为字符串在内存中的地址。作为变量,p本身的值是可变的,能做类似++p这样的操作的。
而数组名本身为数组的首地址,是一个常量值,本身是不可变的,++a这样的语句是编译不过的。
再想想,如果要问指针和数组名,没必要放在这种场景下(函数局部),那是要问其内存存贮方式了?而这也正是面试官想要问的点。
字符串在编译时,字符串作为数据,本身是会编译到可执行文件或库文件中的,存放在数据段中。
在上述的声明方式中,p的值即为字符串在数据段中的地址,而该段在映射到进程地址空间时为只读,所以类似*p=’a’;这样的操作是有问题的。
而数组a[]本身所占的内存在栈上,并且执行函数fun的时候,会对a[]的内存进行赋值操作,将数据段中的”hello world”拷贝到a[]的内存中,所以可以做类似a[0] = ‘b’这样的操作,并且其修改的为a[]中的值,而不是原数据段中的值。
面试结束后,我后来仔细想了想,我发觉在好久以前就见过这个问题了,竟然忘光了,所以有了些感触,以后还是多做总结记录吧。
小学老师就教过我们“好记心不如烂笔头”,这话没毛病。