更多课程 选择中心

C/C++培训
达内IT学院

400-996-5531

“C/C++中char* 和 char「」区别

  • 发布:C++培训
  • 来源:C++资讯
  • 时间:2020-08-10 11:24

1、这两种类型都可以对应一个字符串,比如:

char * a=”hello1”;

char b[]=”hello2”;

printf(“a=%s, b=%s”, a, b);

其中a是一个指向char变量的指针,b则是一个char数组(字符数组),

其次 ,很多时候二者可以混用,像函数传参数的时候,实参可以是char*,形参可以是 char[],比如:

void fun1(char b[])

{

printf(“%s”,b);

}

int main()

{

char *a=“HellowWorld”;

fun1(a);

}

反过来,实参可以是char[],形参可以是 char *也是可以的。

2、他们都是以'\0'结尾;(注意不同的求长度函数对他们的处理不同,有的计算'\0',有的没有计算);

strlen()是取字符串除去结尾符 “\0” 的长度;

sizeof()是包含‘\0’的长度

存在即合理,char *和char[]肯定是有本质的不同

接下来查看他们的不同点:

1.char*是变量,值可以改变;

char[]是常量,值不能改变。

如下:

char * a=”string1”;

char b[]=”string2”;

a=b; //OK

a=”string3”; //OK

b=a; //报错!左边操作数只读

b=”string3” //报错!左边操作数只读

解释:a是一个char型指针变量,其值(指向)可以改变;

b是一个char型数组的名字,也是该数组首元素的地址,是常量,其值不可以改变 。

2、char[]对应的内存区域总是可写,char*指向的符号常量不能写

char *p = "sample";

*(p + 4) = '1'; //程序会崩溃

崩溃的原因在于char*定义的p是在栈中分配的一个指针,“sample”是一个在静态区分配了一块常量区,指针p指向了这块常量去,常量去是无法进行数据的更改的,所有在试图更改“sample”的时候程序会崩溃。

char a[] = "sample";

a[1] = 'b';

printf("a=%s\n", a);

程序可以正常运行,可以发现数组a的值成功的被改成了“sbmple”。

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

根据c内存区域划分知识,我们知道,局部变量都创建在栈区,而常量都创建在文字常量区,显然,a、b都是栈区的变量,但是a指向了常量(字符串常量),b则指向了变量(字符数组),指向了自己(&b==b==&b[0])。

说明以下问题:

char * a=”string1”;实现了3个操作:

1、声明一个char*变量(也就是声明了一个指向char的指针变量)。

2、在内存中的文字常量区中开辟了一个空间存储字符串常量”string1”。

3、返回这个区域的地址,作为值,赋给这个字符指针变量a

最终的结果:指针变量a指向了这一个字符串常量“string1”

(注意,如果这时候我们再执行:char * c=”string1”;则,c==a,实际上,只会执行上述步骤的1和3,因为这个常量已经在内存中创建)

char b[]=”string2”;则是实现了2个操作:

1、声明一个char 的数组,

2、为该数组“赋值”,即将”string2”的每一个字符分别赋值给数组的每一个元素,存储在栈上。

最终的结果:“数组的值”(注意不是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”;

1、a是const char 类型, b是char const类型

2、a是一个指针变量,a的值(指向)是可以改变的,但a只能指向(字符串)常量,指向的区域的内容不可改变;

3、b是一个指针常量,b的值(指向)不能变;但b指向的目标(数组b在内存中的区域)的内容是可变的

4、作为函数的声明的参数的时候,char []是被当做char *来处理的!两种形参声明写法完全等效!

文章来源:电子发烧网,版权声明:转载文章来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:Linux C/C++定时器简单实现小方法
下一篇:现在工作中,C++ 主要用来做什么?

C语言宏定义的几种使用方法

C与C++内存管理避坑指南

C/C++代码规范注释有哪些讲究?

C语言中,全局变量滥用的后果竟如此严重?

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省