char[] 就是普普通通的字符数组
char* 却是王子一般的字符指针
你如果把一个字符串赋值给char* 类型的变量
那其实也可以当字符数组来用
但是和char[]的区别在哪里呢?
我们要搞清这个指针的本质——char* 储存了字符串的第一位的地址
首先要知道C语言编译器怎么处理字符串的: 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc",那么编译器帮你存储的是"abc\0".
对比一:以字符串直接量作为初始值
作为字符指针的初始值
"hello"
是一个字符串直接量,编译器将其作为const char\*
处理,与之相关联的内存空间位于内存的只读部分,即允许编译器重用指向等价字符串直接量的引用以优化内存使用,即使程序 中使用了字符串直接量500次,编译器在内存中也只是创建了一个实例。
例如: char *ptr = “hello”;
等价于 const char *ptr = “hello”;
字符串直接量"hello"
关联的是只读内存,如果试图修改将出错,例如ptr[1] = ‘a’;
是会引起错误的。
作为基于栈的字符数组的初始值
由于基于栈的变量不可能引用其他地方存储的内存,编译器会负责将字符串直接量复制到基于栈的数组内存中。
例如: char stackArray[] = “hello”;
做如下修改: stackArray[1] = ‘a’;
是正确的。
对比二:sizeof()函数
对字符指针使用sizeof函数,返回指针的大小(根据机器有所不同,我的是4个字节)
对字符数组使用sizeof函数,返回数组的大小
参考博客:
[cpp] 字符数组,字符指针,sizeof,strlen总结
size of character array and size of character pointer
写C还是要懂底层=.=