C语言中字符串与字符数组分析 下载本文

内容发布更新时间 : 2024/5/21 11:17:12星期一 下面是文章的全部内容请认真阅读。

C语言中字符串与字符数组分析

字符串并不是C语言中默认存在的类型,但是由于字符串的实用性,在谭浩强C语言中有对字符串的一些描述,但是不是特别的详细。有时候写代码时都不会注意到一些小细节,本文就结合实验分析一下字符串与字符数组之间的差别。

字符串与字符数组的区别在过去我一直是处于一知半解的状态,字符串是通常被认为是常量,是保存在一段固定的内存中的,这段内存是以'\\0'为结束符,这段内存通常只能通过一个指针来找到。字符数组其实和其他数组没什么区别,只是保存的数据类型是字符类型(char),它没有强制要求最后的元素是否是'\\0'。字符数组的数组名是指向第0个字符的指针,而不是指向这个字符串的。这与我前期博客中对数组的分析结论是相同的,数组名并不像指针存在一个地址来保存指针名,数组名可以看做是汇编程序中的一个标号,并没有专门的地址来保存数组名。

但是字符串和字符数组又有很多相似的地方,特别是当我们结合指针操作字符数组时候,就会导致错误的

产生,我觉得只有搞清楚一些概念就能较好的避免这种错误的产生。这个概念就是指针就是指针,数组就是数组,两个搞混只是因为某些巧合使我们误以为指针和数组是等值的。两者实质上是不相同的。

字符数组和字符串的定义如下: 1. //字符串 2.

char *str = "string is a constant"; 3. //字符数组 4.

char strarray[] = {'s','t','r','i','n','g',' ','i','s',' ','a','

','c','o','n','s','t','a','n','t','\\0'}; 5. //或者 6.

char strarray[] = "string is a constant"; 7.

char strarray[] = {"string is a constant"};

其中从上面的定义可以知道字符串实质上一块内存,其中保存的值是常量,常量其实就是不能采用程序对内存中的值进行修改,当然只是程序不能,我认为就像嵌入式C语言中的const类型一样,虽然我们通常认为这个变量是常量,但实质上是只读性变量,只是不能通过程序修改,还可以通过其他的方式修改。这时候str指向的内存空间中保存的数据是不能被程序修改的,也只能通过str指针对这段内存进行访问。

如果字符数组定义成单个的字符,我们也许还能较好的分别,但如果是如第二种定义、第三种形式定义,我们可能就会产生很大的不理解,这与字符串的类型基本上没有什么差别,只是多了一个数组符号[ ],但是这个数组符号就意味着数据类型的改变,我们可以知道数组中的值是可以改变的,不是常量,说明strarray是一个数组变量,而str却是一个字符串常量指针。Strarray是一个标号,存储器中并没有专门分配内存空间存储strarray的值。但是指针和数组名很多时候的一些相似性使得我们在处理的时候很难去判断,比如下面这段代码: