博客
关于我
字符数组和字符串常量(加上常量更好理解)的区别,C语言字符数组和字符串(常量)区别详解,字符串指针和字符数组区别
阅读量:140 次
发布时间:2019-02-27

本文共 2463 字,大约阅读时间需要 8 分钟。

C 语言中并不存在字符串这个数据类型,而是使用字符数组来保存字符串。那么,字符数组就一定是字符串吗?

1字符串和字符串结束标志

在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量时,已说明字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。

C语言允许用字符串的方式对数组作初始化赋值。

例如:

    char c[]={'c', ' ','p','r','o','g','r','a','m'};

可写为:

        char c[]={"C program"};

    或去掉{}写为:

        char c[]="C program";

用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'。上面的数组c在内存中的实际存放情况为:

C

 

p

r

o

g

r

a

m

\0

    \0'是由C编译系统自动加上的。由于采用\0'标志,所以在用字符串赋初值时一般无须指定数组长度, 而由系统自行处理。

 

当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符

但要注意空格(打印符号ASC码是32)和字符串结束符号(非打印符号NULL空\0)不同

 

 

2使用字符串指针变量与字符数组的区别

    用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题:

字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。

对字符串指针方式

char *ps="C Language";

可以写为:

    char *ps;

ps="C Language";

而对数组方式:

    static char st[]={"C Language"};

不能写为:

    char st[20];

    st={"C Language"};

而只能对字符数组的各元素逐个赋值。

     从以上几点可以看出字符串指针变量与字符数组在使用时的区别,同时也可看出使用指针变量更加方便。

前面说过,当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值时要给以确定的地址。

因此,

    char *ps="C Langage";

或者

    char *ps;

    ps="C Language";

都是合法的。

对于这个问题,大多教科书中的回答是“是”。其实不然,字符数组和字符串是完全不相同的两个概念,千万不要混淆。分析如下所示的示例代码。

#include 
#include
int main(void){    /*字符数组赋初值*/    char cArr[] = {'I','L','O','V','E','C'};    /*字符串赋初值*/    char sArr[] = "ILOVEC";    /*用sizeof()求长度*/    printf("cArr的长度=%d\n", sizeof(cArr));    printf("sArr的长度=%d\n", sizeof(sArr));    /*用strlen()求长度*/    printf("cArr的长度=%d\n", strlen(cArr));    printf("sArr的长度=%d\n", strlen(sArr));    /*用printf的%s打印内容*/    printf("cArr的内容=%s\n", cArr);    printf("sArr的内容=%s\n", sArr);    return 0;}运行结果为:cArr的长度=6sArr的长度=7cArr的长度=7sArr的长度=6cArr的内容=ILOVEC*sArr的内容=ILOVEC从代码及其运行结果中可以看出如下几点。首先,从概念上讲,cArr 是一个字符数组,而 sArr 是一个字符串。因此,对于 sArr,编译时会自动在末尾增加一个 null 字符(也就是'\0',用十六进制表示为 0x00);而对于 cArr,则不会自动增加任何东西。记住,这里的 sArr 必须是“char sArr[7]="ILOVEC"”,而不能够是“char sArr[6]="ILOVEC"”。其次,“sizeof()”运算符求的是字符数组的长度,而不是字符串长度。因此,对于“sizeof(cArr)”,其运行结果为 6;而对于 sizeof(sArr),其运行结果为 7(之所以为 7,是因为 sArr 是一个字符串,编译时会自动在末尾增加一个 null 字符)。因此,对于以下代码:/*字符数组赋初值*/char cArr[] = {'I','L','O','V','E','C'};/*字符串赋初值*/char sArr[] = "ILOVEC";

也可以写成如下等价形式:

/*字符数组赋初值*/char cArr[6] = {'I','L','O','V','E','C'};/*字符串赋初值*/char sArr[7] = "ILOVEC";

最后,对于字符串 sArr,可以直接使用 printf 的 %s 打印其内容;而对字符数组,很显然使用 printf 的 %s 打印其内容是不合适的。

通过对以上代码的分析,现在我们可以很简单地得出字符数组和字符串二者之间的区别:

  • 对于字符数组,其长度是固定的,其中任何一个数组元素都可以为 null 字符。因此,字符数组不一定是字符串。
  • 对于字符串,它必须以 null 结尾,其后的字符不属于该字符串。字符串一定是字符数组,它是最后一个字符为 null 字符的字符数组。

转载于:

你可能感兴趣的文章
MySQL5.6的Linux安装shell脚本之二进制安装(一)
查看>>
MySQL5.6的zip包安装教程
查看>>
mysql5.7 for windows_MySQL 5.7 for Windows 解压缩版配置安装
查看>>
Webpack 基本环境搭建
查看>>
mysql5.7 安装版 表不能输入汉字解决方案
查看>>
MySQL5.7.18主从复制搭建(一主一从)
查看>>
MySQL5.7.19-win64安装启动
查看>>
mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
查看>>
MySQL5.7.37windows解压版的安装使用
查看>>
mysql5.7免费下载地址
查看>>
mysql5.7命令总结
查看>>
mysql5.7安装
查看>>
mysql5.7性能调优my.ini
查看>>
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>