C/C++中,为什么字符串可以赋值给字符指针变量,单引号和双引号的区别

本文是通过几篇转帖的文章整理而成的:

http://www.slyar.com/blog/c-quotation-marks.html

http://www.cnblogs.com/KingOfFreedom/archive/2012/12/07/2807223.html

1、含义不同。

用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。而一般我们的编译器采用的都是ASCII字符集。因此's'的含义其实和十进制数115的含义是一致的。

而用双引号引起的字符串,代表的是一个指向无名数组起始字符的指针。

2、大小不同。

用单引号引起的一个字符大小就是一个字节。

而用双引号引起的字符串大小是字符的总大小+1,因为用双引号引起的字符串会在字符串末尾添加一个二进制为0的字符'\0'。

具体介绍

为什么字符串可以赋值给字符指针变量

char *p,a='5';
p=&a;                     //显然是正确的,
p="abcd";              //但为什么也可以这样赋值??

问:一直理解不了为什么可以将字串常量赋值给字符指针变量,请各位指点!
 
答:
双引号做了3件事:  
1.申请了空间(在常量区),存放了字符串 
2. 在字符串尾加上了'/0'    
3.返回地址

你这里就是 返回的地址  赋值给了  p                      


二、

char *p = “hello”;

上边的表达式为什么可以,而把p换成数组,然后再赋值就不行了

解释:

字符串常量"hello"出现在一个表达式中时"hello"表达式使用的值就是这些字符所存储的地址(在常量区),而不是这些字符本身。

所以,可以把字符串赋值给指向字符的指针p,而不能把字符串赋值给一个字符数组。 

char a[10] = “hello”; //这样可以,这种情况是c语言初始化所支持的

如果写成char a[10]

然后 a = “hello” 这样就错误了。  

同样是a数组,char a[10] = “hello”;这种是数组的初始化,和a[0] = ‘h’ a[1] = ‘e’…是一个道理

但是换成char a [10]

然后a = “hello”就不行了 “hello”赋值的值是一个地址,而a虽然也有地址,但是这与指针是不一样的,指针的值是地址,而数组的值虽然也是地址,但是却是一个常量,所以不能给常量赋值。

代码测试

#include <stdio.h> 

int main()

{

       char *p = "hello";

       printf("%s",p);

       char a[10];

       a = "hello";

       return 0;

}

error C2440: '=' : cannot convert from 'char [6]' to 'char [10]'

        There is no context in which this conversion is possible

看到这样的错误提示,你是否会想到把char a[10]改成char a[6]呢

试一下,

error C2106: '=' : left operand must be l-value

运算符的左边应该是一个“左值”。所谓“左值”就是指在程序中占用内存空间、可以被修改的量,比如各种变量。 

 

继续扩展问题:

在使用指针的时候,指针可以自增,而数组不能自增

编译器给数组分配了空间,数组a的地址就是一个常量了,让常量自增这肯定是不行的。 

继续扩展:

      在指针自增的时候,编译器会自动识别类型比如指针是指向int型的,想获取下一个的地址时,指针直接p++就行了,不要多此一举的p+4了

      特别需要注意的是,在void指针使用的时候,不能使用指针运算,应为void型编译器不能识别类型的长度(即指针所指对象的体积),p++这样就是不合法的,即不能进行数学运算,也不能使用*取值操作,想使用必须转换为其它的类型


发布了31 篇原创文章 · 获赞 8 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览