其他
“C/C++中char* 和 char「」区别
来源 :今日头条@技术小白学习之路
1、这两种类型都可以对应一个字符串,比如:
char * a=”hello1”;
char b[]=”hello2”;
printf(“a=%s, b=%s”, a, b);
void fun1(char b[])
{
printf(“%s”,b);
}
int main()
{
char *a=“HellowWorld”;
fun1(a);
}
2、他们都是以'\0'结尾;(注意不同的求长度函数对他们的处理不同,有的计算'\0',有的没有计算);
strlen()是取字符串除去结尾符 “\0” 的长度;
接下来查看他们的不同点:
char[]是常量,值不能改变。
如下:
char * a=”string1”;
char b[]=”string2”;
a=b; //OK
a=”string3”; //OK
b=a; //报错!左边操作数只读
b=”string3” //报错!左边操作数只读
2、char[]对应的内存区域总是可写,char*指向的符号常量不能写
char *p = "sample";
*(p + 4) = '1';//程序会崩溃
char a[] = "sample";
a[1] = 'b';
printf("a=%s\n", a);
3.char * 和char[]的初始化操作有着根本区别:
测试代码:
char *a=”Hello World”;
char b[]=”Hello World”;
printf(“%s, %d\n”,”Hello World”, “Hello World”);
printf(“%s, %d %d\n”, a, a, &a);
printf(“%s, %d %d\n”, b, b, &b);
结果可见:尽管都对应了相同的字符串,但”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”;
保证意外赋值语句不会通过编译。
小结
const char * a=”string1”
char b[]=”string2”;
-END-
推荐阅读
【01】用C语言编程,如何节省存储空间?【02】详解FPGA四大设计要点【03】现在市场上,C++ 主要用来做什么?【04】手把手教你嵌入式C语言优化技巧【05】注意!使用FPGA“代替”CPU,说法不准确!