C语言中的字符串

首先需要说明的是,C语言里的字符串其实就是字符数组,C++中的字符串类指的是std空间里的string类。

char*p;这句声明(此处也是定义)了一个char*类型的变量,即一个字符指针变量,编译器需要在栈上分配出4个字节的空间(sizeof(p)=4)来存储p,注意此时p没有初始化,这不是一个好习惯。

char *p = "abcde";这句编译器先在常量存储区开辟6个字节的空间来存储"abcde"字符数组,然后在栈上分配4个字节的空间存储字符指针变量p,并将其初始化,使p指向存储"abcde"的那块存储区,注意"abcde"的类型是const char [6].。因为此时p指向的是常量存储区,所以当然不可以p[0] = 'A'。p和"abcde"根本就不在一块存储区,所以,若还有char *q = "abcde",常量存储区只保存一份"abcde",所以p和q的值相同。

char a[];这么定义肯定不合法,没指定长度,编译器都不知道要分配多少空间才好。

char a[6] = "abcde";(或者char a[] = "abcde"是一样的,编译器会自动计算长度)。这里编译器在栈上分配6个字节的空间给a,(注意sizeof(a) = 6),就是说,a就对应着这6个字节,从a[0]到a[5],并不需要额外的空间来存储a,数组在内存中是一种聚合结构,所以说,数组名对应一块内存,而指针则是访问内存引入的一个中间层来间接实现访问内存。(“Any problem in computer science can be solved by another layer of indirection。”)实际上,char a[6] = "abcde"这句只是char a[] = {'a','b','c','d','e','\0'}的简写而已。

在C/C++语言中,存在一种decay rule,姑且叫退化规则吧,使数组名a就像是一个指向第一个元素的指针(准确的说,是个指针常量),所以可以自动执行char *p = a;尽管p和a的类型不同。但是逆向的就不行,不能从char *自动转换为char [6]!这里需要说明的是a+1的类型是char *,所以不能a = a+1,因为类型不匹配。(另外char [6] 和char [8]是不同的类型)。

数组退化为指针之后,会丢失第一维的信息。在《C和指针》的8.1节中总结了除了两种情况,其他时候数组名都会退化为指针。1、是sizeof运算符作用于数组名,返回的整个数组所占的字节大小;2、取地址运算符&作用于数组名,得到的是数组指针。在C++中,还有另外一种情况,就是数组的引用时,维度信息仍然会保存着。

我觉得讨论数组名是左值还是右值意义不大。一方面,char a[]= "abcde";char b[6];b=a;这种将数组置于赋值运算符的左边,显然不合理。另一方面,对a取地址&a却完全是有意义的,(&a的类型是(char (*)[6])。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值