字符串赋值是什么意思

字符串主要用于编程,字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的,如s=“abcdefghij”,则s[1]=“a”,s[9]=j,而字符串的零位正是它的长度,如s[0]=10(※上述功能Ansistring没有。),这可以给我们提供很多方便,如高精度运算时每一位都可以转化为数字存入数组。

但是字符串赋值有一定要求,例如C语言的运算符根本无法操作字符串。在C语言中把字符串当作数组来处理,因此,对字符串的限制方式和对数组的一样,特别是,它们都不能用C语言的运算符进行复制和比较操作。

字符串赋值方式

C语言中,字符串的表现形式有两种:一种是以字符数组的形式,如char str[20]=I love china;另一种是以字符指针的形式,如char *str=I love china。字符串可以赋值给字符指针变量,或者将字符串用字符数组保存。因为c语言没有直接对字符串提供语法糖方面的支持。而且C标准库很多方法处理字符串是以空字符结尾为前提的,这个必须要记住。

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

在如上程序中,双引号做了3件事:申请了空间(在常量区),存放了字符串 ;在字符串尾加上了’/0’ ;返回地址。这里就是把返回的地址赋值给了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虽然也有地址,但是这与指针是不一样的,指针的值是地址,而数组的值虽然也是地址,但是却是一个常量,所以不能给常量赋值。 [3]

我们来测试一下:

#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++这样就是不合法的,即不能进行数学运算,也不能使用*取值操作,想使用必须转换为其它的类型。

相关文章

项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件...
简介 本文的初衷是希望帮助那些有其它平台视觉算法开发经验的...
这篇文章主要简单记录一下C#项目的dll文件管理方法,以便后期...
在C#中的使用JSON序列化及反序列化时,推荐使用Json.NET——...
事件总线是对发布-订阅模式的一种实现,是一种集中式事件处理...
通用翻译API的HTTPS 地址为https://fanyi-api.baidu.com/api...