来源 :今日头条@技术小白学习之路 1、这两种类型都可以对应一个字符串,比如:
void fun1(char b[]) { printf(“%s”,b); } int main() { char *a=“HellowWorld”; fun1(a); } 2、他们都是以'\0'结尾;(注意不同的求长度函数对他们的处理不同,有的计算'\0',有的没有计算); strlen()是取字符串除去结尾符 “\0” 的长度; 接下来查看他们的不同点: char[]是常量,值不能改变。 如下:
2、char[]对应的内存区域总是可写,char*指向的符号常量不能写
char a[] = 'sample'; a[1] = 'b'; printf('a=%s\n', a); 3.char * 和char[]的初始化操作有着根本区别:
结果可见:尽管都对应了相同的字符串,但”Hellow World”的地址 和 a对应的地址相同,与b指向的地址有较大差异;&a 、&b都是在同一内存区域,且&b==b 说明以下问题: char * a=”string1”;实现了3个操作: 1、声明一个char*变量(也就是声明了一个指向char的指针变量)。 最终的结果:指针变量a指向了这一个字符串常量“string1” (注意,如果这时候我们再执行:char * c=”string1”;则,c==a,实际上,只会执行上述步骤的1和3,因为这个常量已经在内存中创建) 1、声明一个char 的数组, 最终的结果:“数组的值”(注意不是b的值)等于”string2”,而不是b指向一个字符串常量 实际上, char * a=”string1”; 的写法是不规范的! 因为a指向了即字符常量,一旦strcpy(a,”string2”)就糟糕了,试图向只读的内存区域写入,程序会崩溃的!尽管VS下的编译器不会警告,但如果你使用了语法严谨的Linux下的C编译器GCC,或者在windows下使用MinGW编译器就会得到警告。 所以,我们还是应当按照”类型相同赋值”的原则来写代码:const char * a=”string1”; 保证意外赋值语句不会通过编译。 小结
|
|
来自: 西北望msm66g9f > 《编程》