char*与char[]的区别
之前在给函数传形参时,char*和char[]我是混着用的,当时感觉它俩用起来没啥差别,就草率地把它俩混为一谈。
但实际上,这俩本质是不同的,只是在作为形参的时候可以互换使用。我这篇博客就是来记录下它俩的区别。
现在我定义出指针p和字符数组arr:
int main()
{
char* p = "abc";
char arr[] = "111";
return 0;
}
p和arr的不同
p和arr有着本质的不同。
p是变量,用于存放地址的,开在栈区。变量的值是可以改变的,我们通过改变p中的地址,来改变指针的指向。
arr是常量,是数组首元素的地址,存放在静态区。常量是无法改变的!
"abc"和"111"的不同
这俩字符串本质也是不同的。
"abc"是常量字符串,是无法修改的。其实我们这样写char* p = "abc";在很多编译器下会报错,因为"abc"是const char*类型的常量字符串,当前的写法存在类型不匹配的问题,正确的写法应该是const char * p = "abc";。
"111"是变量,是栈区中的一块数组空间,111是被写进这个空间里的。此空间可读可写。
为什么"abc"和"111"在本质上会有这么大差别呢?答案是天生如此。也就是说,char*与char[]在初始化的时候,就是完全不同的。
char* p = "abc";的初始化:
1.在静态区上申请一块空间,存放字符串常量"abc"
2.在栈区上为指针变量p开空间。
3.把"abc"的地址存进p里。OK,现在p就是指向常量了,当然,p本身是可以改变指向的。
char arr[] = "111";的初始化:
1.在栈区上为数组变量开空间
2.将常量”111“的内容拷贝到数组变量里去
3.因为数组是连续存储的空间,要想找到它就只需知道首元素的地址。把首元素的地址赋给常量arr。