字符数组及其定义和初始化,C语言字符数组详解

字符串的存储方式有字符数组和字符指针,我们先来看看字符数组。

因为字符串是由多个字符组成的序列,所以要想存储一个字符串,可以先把它拆成一个个字符,然后分别对这些字符进行存储,即通过字符数组存储。字符数组是一个数组,且是存储字符的数组,该数组中一个元素存放字符串的一个字符。

字符数组的定义

因为字符数组首先是一个数组,所以前面讲的数组内容通通都适用。其次它是存放字符的数组,即数组的类型是 char 型。比如:

char name[10];

表示定义了 10 字节的连续内存空间。

1) 如果字符串的长度大于 10,那么就存在语法错误。这里需要注意的是,这里指的“字符串的长度”包括最后的 '\0'。也就是说,虽然系统会自动在字符串的结尾加 '\0',但它不会自动为 '\0' 开辟内存空间。所以在定义数组长度的时候一定要考虑 '\0'。

2) 如果字符串的长度小于数组的长度,则只将字符串中的字符赋给数组中前面的元素,剩下的内存空间系统会自动用 \0' 填充。

字符数组的初始化

字符数组的初始化与数组的初始化一样,要么定义时初始化,要么定义后初始化。下面写一个程序来说明这个问题:

# include

int main(void)

{

char a[10];

a[0] = 'i'; a[1] = ' '; a[2] = 'l'; a[3] = 'o'; a[4] = 'v';

//空格字符的单引号内一定要敲空格

a[5] = 'e'; a[6] = ' '; a[7] = 'y'; a[8] = 'o'; a[9] = 'u';

//空格字符的单引号内一定要敲空格

a[10] = '\0';

char b[10];

b[0] = 'i'; b[1] = ' '; b[2] = 'm'; b[3] = 'i'; b[4] = 's';

//空格字符的单引号内一定要敲空格

b[5] = 's'; b[6] = ' '; b[7] = 'y'; b[8] = 'o'; b[9] = 'u';

//空格字符的单引号内一定要敲空格

char c[] = "i believe you";

char d[] = {'i', ' ', 'l', 'i', 'k', 'e', ' ', 'y', 'o', 'u','\0'};

//空格字符的单引号内一定要敲空格

char e[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};

//空格字符的单引号内一定要敲空格

char f[] = "上课睡觉觉, 下课打闹闹, 考试死翘翘";

char g[10] = "";

printf("a = %s\n", a); //输出字符串用%s, 输出参数必须写数组名

printf("b = %s\n", b);

printf("c = %s\n", c);

printf("d = %s\n", d);

printf("e = %s\n", e);

printf("f = %s\n", f);

printf("g = %s\n", g);

return 0;

}

输出结果是:

a = i love you

b = i miss you烫i love you

c = i believe you

d = i like you

e = Hello World蘨 like you

f = 上课睡觉觉, 下课打闹闹, 考试死翘翘

g =

首先要说明的是,这个程序只有在 .cpp 文件中才能运行,在 .c 文件中会有很多错误。因为我们在前面讲过,C89 标准规定变量的定义只能在程序的开头,或者说定义变量的前面不能有其他非声明或非定义的语句。而 .cpp 文件是编写 C++ 程序的,C++ 向下完全兼容 C,而且它对变量定义的位置没有特殊要求,只要在使用位置之前即可。

数组 a 是先定义后初始化。一方面与以前讲的数值型数组一样,先定义后初始化必须一个一个地进行赋值,不能整体赋值;另一方面与以前讲的数值型数组又不一样,对于字符串,先定义后初始化也可以整体赋值,但是要调用 strcpy 函数,这点稍后再讲。

总之上面这个程序中给数组 a 一个一个进行初始化的方式很麻烦。而且这样写需要注意:前面讲过系统会在字符串的最后自动添加结束标志符 '\0',但是当一个一个赋值时,系统不会自动添加 '\0',必须手动添加。如果忘记添加,虽然语法上没有错误,但是程序将无法达到我们想要的功能。数组 b 就是这样的例子。

此外,空格字符必须要在单引号内“敲”一个空格,不能什么都不“敲”,什么都不“敲”就是语法错误。也不能多“敲”,因为一个单引号内只能放一个字符,“敲”多个空格就是多个字符了。

数组b就是最后没有手动添加 '\0' 的例子。程序是希望数组 b 输出“i miss you”,但输出结果是“i miss you烫i love you”。原因就是系统没有在最后添加'\0'。

虽然程序中对数组 b 的长度进行了限制,即长度为 10,但是由于内存单元是连续的,对于字符串,系统只要没有遇到 '\0',就会认为该字符串还没有结束,就会一直往后找,直到遇到 '\0' 为止。被找过的内存单元都会输出,从而超出定义的 10 字节。

数组 c 是定义时初始化。定义时初始化可以整体赋值。整体赋值有一个明显的优点——方便。定义时初始化可以不用指定数组的长度,而先定义后初始化则必须要指定数组的长度,如数组 a 和数组 b。不用指定数组长度有一个好处:不用人为确定需要多少字节的内存空间,系统会根据初始化的内容自动分配数量正好的内存空间。而且对于数组 c 的写法系统会自动在最后添加结束标志符 '\0',不需要人为添加。

数组 d 也是定义时初始化,但它既属于整体赋值,也属于一个一个赋值。说它是整体赋值是因为不用写 d[0]、d[1]…而说它是一个一个赋值是因为它把整个句子分成了一个一个的字符。还是数组 c 的写法比较方便,而且对于数组d的写法系统也不会自动在最后添加结束标志符 '\0',必须人为添加。如果忘记添加就会出现与数组 b 同样的错误。从数组 e 的输出结果可以看出这一点。

数组 f 是存储汉字,汉字不能像数组 a 或数组 d 那样分开一个一个赋值。因为一个汉字占 2 字节,若分开赋值,由于一个单引号内只能放一个字符,即一字节,所以将占 2 字节的汉字放进去当然就出错了。因此如果用字符数组存储汉字的话必须整体赋值,即要么定义时初始化,要么调用 strcpy 函数。

数组 g 初始化为一对双引号,表示该字符数组中 10 个元素的内容都为 '\0'。下面写一个程序验证一下:

# include

int main(void)

{

char str[3] = "";

str[2] = 'a';

printf("str = %s\n", str);

return 0;

}

输出结果是:

str =

程序中定义了一个长度为 3 的字符数组,然后给第三个元素赋值为 'a',然后将整个字符数组输出。但是输出结果什么都没有,原因就是其直接初始化为一对双引号,此时字符数组中所有元素都是 '\0'。所以虽然第三个元素为 'a',但因为第一个元素为 '\0',而 '\0' 是字符串的结束标志符,所以无法输出。

需要注意的是,使用此种初始化方式时一定要指定数组的长度,否则默认数组长度为 1。

总结,字符数组与前面讲的数值数组有一个很大的区别,即字符数组可以通过“%s”一次性全部输出,而数值数组只能逐个输出每个元素。

编程帮,一个分享编程知识的公众号。跟着站长一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「编程帮」,你已然超越了90%的程序员!

微信扫描二维码关注

python定义字符串数组初始化_字符数组及其定义和初始化,C语言字符数组详解...相关推荐

  1. c++定义一个动态全局变量_静态链接与动态链接的宏观概述及微观详解

    静态链接与动态链接的宏观概述及微观详解 第一部分 宏观概述 1. 静态链接 静态链接就是在程序运行前,链接器通过对象文件中包含的重定位表,完成所有重定位操作,并最终形成一个在运行时不需要再次进行依赖库 ...

  2. python随机森林变量重要性_随机森林如何评估特征重要性【机器学习面试题详解】...

    今天爱分享给大家带来随机森林如何评估特征重要性[机器学习面试题详解],希望能够帮助到大家. 解析: 衡量变量重要性的方法有两种,Decrease GINI 和 Decrease Accuracy: 1 ...

  3. r语言 siar 代码_平滑转换自回归(STAR)模型的R语言编程实现详解

    总体讲,ST(Smooth transition)模型,这块的code混乱的比较狗血,文献中的做法也是千奇百怪, 单变量的有 :STAR, LSTAR, ESTAR, 多变量的有:STVAR, LST ...

  4. python语言的格式框架_django框架模板语言使用方法详解

    本文实例讲述了django框架模板语言使用方法.分享给大家供大家参考,具体如下: 模板功能 作用:生成html界面内容,模版致力于界面如何显示,而不是程序逻辑.模板不仅仅是一个html文件,还包括了页 ...

  5. python自动解析json_Python语言解析JSON详解

    本文主要向大家介绍了Python语言解析JSON详解,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. JSON 函数使用 JSON 函数需要导入 json 库:import jso ...

  6. [Python从零到壹] 三十六.图像处理基础篇之图像算术与逻辑运算详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. C语言字符集中可显示字符,C++_C语言转义字符实例详解,在字符集中,有一类字符具有 - phpStudy...

    C语言转义字符实例详解 在字符集中,有一类字符具有这样的特性:当从键盘上输入这个字符时,显示器上就可以显示这个字符,即输入什么就显示什么.这类字符称为可显示字符,如a.b.c.$.+和空格符等都是可显 ...

  8. ★核心关注点_《信息系统项目管理师考试考点分析与真题详解》

    ★核心关注点_<信息系统项目管理师考试考点分析与真题详解> 真诚感谢你选用<信息系统项目管理师考试考点分析与真题详解>作为高级项管的辅导用书.对于使用该书的读者们,在备考201 ...

  9. 有十五个数按由大到小顺序存放在一个数组中_数据结构基础 (代码效率优化, 线性表, 栈, 队列, 数组,字符串,树和二叉树,哈希表)...

    作者:张人大 代码效率优化 复杂度 -- 一个关于输入数据量n的函数 时间复杂度 -- 昂贵 与代码的结构设计有着紧密关系 一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关 空间 ...

  10. python将字符串逆序_为什么说Python是一门伟大的入门语言?(附免费教程)

    Python 是一门伟大的入门语言.作为一门伟大的编程语言,一定要具备一些特征,其中有五项特征是非常重要的: 非常棒的首次体验:就像书的开始,首先一定要能够"沉迷",学习新知识一定 ...

最新文章

  1. 功能测试怎么学?阿里测试工程师教你4个步骤
  2. 我们前端忙成狗人家后端写SQL?
  3. Java 寻找幸运数
  4. OpenStack入门篇(八)之镜像服务Glance
  5. python tcp协议加代理_python实现简单的TCP代理服务器
  6. ecshop模板支持php,[老杨原创]关于ECSHOP模板架设的服务器php版本过高报错的解决方法集合...
  7. tickcount()修改成小时分钟_银行核心系统24小时机制实现总结
  8. 怎么用c语言写贪吃蛇贴吧,刚学C语言,想写一个贪吃蛇的代码
  9. java动态创建bean的意义_Spring Boot如何动态创建Bean示例代码
  10. Paint方法总结(二):着色渲染器Shader
  11. html新建盒子,html+css 盒子模式展示(备查)
  12. 《HTML5和JavaScript Web应用开发》——2.6 QA和设备测试
  13. java模拟器下载文件_KEmulator(java模拟器)最新下载
  14. 程序员成长之旅——进程间通信(IPC)
  15. FVCOM离线拉格朗日配置
  16. 2月28日 赵神牛打BOSS
  17. 计算机的网络安全事件,网络安全事件报告与处置流程
  18. ps cs6移除html,ps cs6清除照片中不想要的杂物教程
  19. java-net-php-python-20jspm健身网站管理计算机毕业设计程序
  20. 计算机开始菜单打不开是什么原因,电脑开始菜单打不开怎么办_win7开始菜单点击无效解决方法...

热门文章

  1. 计算机主机外接电源,一种计算机主机箱电源接头结构的制作方法
  2. 【git】checkout时遇到的detached HEAD问题
  3. 0-3岁的重要性进行了很多阐述
  4. Flame diagram
  5. 《大数据+AI在大健康领域中最佳实践前瞻》---- 连续血糖监测(CGM) 初探
  6. quatzy获取参数强转异常,devtools类加载机制问题
  7. 高通滤波的c语言程序,请教一个关于用C来编写高通滤波和FFT的小项目
  8. 雅思作文未来计算机的应用,2020年8月6日雅思大作文真题参考范文: 间隔年的优劣势~...
  9. if 0 endif if 1 endif
  10. 搞流量的小道道(扶摇生财思维)