【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析

之前有一篇文章是学习了字符和字符串的,可以与之结合学习:【C语言进阶深度学习记录】十二 C语言中的:字符和字符串

文章目录

    • 1 字符串的概念
      • 1.1 字符串与字符数组
      • 1.2 字符数组与字符串代码分析
    • 2 字符串字面量
      • 2.1 字符串字面量的本质的代码分析
    • 3 字符串的长度
      • 3.1 strlen 的使用代码分析
    • 4 总结

1 字符串的概念

字符串与字符数组很像,但是有差别,注意留意它们的差别。

  • 字符串是有序字符的集合
  • C语言中,没有字符串的概念(没有string这个关键字,C++中才有)
    1. 但是C语言中,必须使用字符串
    2. 所以C语言通常都是使用特殊的字符数组来模拟字符串
    3. C语言中的字符串,是以’\0’ 结尾的字符数组。也就是说只有字符数组结尾是 ‘\0’ 该字符数组才是字符串,否则该字符数组就是普通的字符数组。这一点很重要!!!

1.1 字符串与字符数组

在C语言中,双引号引用的单个或多个字符是一种特殊的字面量

  • 字面量存储于程序的全局只读存储区
  • 它的本质是字符数组,编译器自动在结尾加上 ‘\0’ 字符。注意,只有双引号下的字面量,编译器才会自动在后面加上’\0’字符。如果是一个普通的字符数组,是要自己在最后加的,否则无法成为字符串。

比如下面哪些是字符串的定义?

在这里插入图片描述

  • 第一个ca不是字符串,它是普通的字符数组。
  • sa 也是字符数组,但是由于它末尾加了’\0’,所以它也是一个字符串
  • ss是用双引号初始化的,编译器会默认在最后加上’\0’,所以ss也是字符串
  • 同理str也是字符串

1.2 字符数组与字符串代码分析

  • 代码: 30-1.c
#include <stdio.h>int main(){char ca[] = {'H', 'e', 'l', 'l', 'o'};char sa[] = {'H', 'e', 'l', 'l', 'o', '\0'};char ss[] = "Hello,World";char* str = "Hello,World";printf("%s\n", ca);printf("%s\n", sa);printf("%s\n", ss);printf("%s\n", str);return 0;
}
  • 编译运行结果如下:

在这里插入图片描述

  • 可以看出,只有第一个ca打印出来是乱码,后面三个都是正常的。因为ca并不是字符串,我们以 ‘%s’ 打印的话,是类型不对应的,导致打印不对。(深层次原因的话是因为打印字符串都是遇到字符串的结尾’\0’就算打印一个字符串,但是ca中没有’\0’ 字符)

2 字符串字面量

对于字符串的字面量,需要掌握几点:

  1. 字符串字面量的本质是一个数组
  2. 字符串字面量可以看做常量指针,代表存储该字符串的地址
  3. 字符串字面量中的字符不可改变(位于全局只读存储区)
  4. 字符串字面量至少包含一个字符(至少有一个’\0’)

类似于这种 “Hello,world” 是一种无名的字符数组

看一下下面三个表达式是正确的么?如果正确,值是多少?

在这里插入图片描述

我们以代码来验证即可:

2.1 字符串字面量的本质的代码分析

  • 代码:30-2.c
#include <stdio.h>int main(){char a = "abc"[0]; //==>a='a'char b = *("123"+1); //==>b='2'char c = *""; //==>c='\0' 它的ASCII码是 0printf("%c\n", a);printf("%c\n", b);printf("%d\n", c);   printf("%s\n", "Hello");printf("%p\n", "Hello");char* p = "def";p+=1;// *p = 'g'; //error 字符串字面量不能更改return 0;
}
  • 编译运行上述代码结果如下:

在这里插入图片描述

可以看出:

  1. 字符串字面量,的确是一个无名数组
  2. 字符串字面量,可以代表它自身的内存地址
  3. 字符串至少包含一个字符’\0’
  4. 字符串字面量存储于全局的只读存储区,不可修改

3 字符串的长度

这是一个比较重要的知识点:

  • 字符串的长度,是指第一个’\0’ 出现之前的所有字符的个数
  • 函数strlen用于返回字符串的长度

如:

在这里插入图片描述

3.1 strlen 的使用代码分析

  • 代码30-3.c
#include <stdio.h>
#include <string.h>int main(){char s[] = "Hello\0World";int i = 0;for(i=0; i<sizeof(s)/sizeof(char); i++){printf("%c\n",s[i]);}printf("sizeof(s) = %d\n", sizeof(s));printf("%s\n", s);printf("%d\n", strlen(s));printf("%d\n", strlen("123"));return 0;
}
  • 编译运行结果为:
    在这里插入图片描述

可以看到:

  1. sizeof求解字符串的大小时,会将最后的隐藏字符’\0’ 也算进去
  2. strlen求解字符长度时,是求解的字符串中第一个’\0’ 之前的所有字符的个数

4 总结

  • C语言中可以通过字符数组模拟字符串
  • C语言中的字符串是以 ‘\0’ 作为结尾字符
  • 字符串字面量的本质是一个无名的字符数组
  • 字符串的相关函数都依赖于最后的结束符 ‘\0’

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET C# I/O 操作

本文内容 流 Stream 和基本操作 用于 I/O 的类 通用 I/O Stream 类 I/O 与安全 演示 如何向文本文件写入字符串如何从文本文件读取字符串如何读取数据文件如何向字符串写入字符如何从字符串读取字符参考资料修改记录2008 年毕业时&#xff0c;在解决问题时&#xff0c;第一反映…

【C语言进阶深度学习记录】二十七 C语言中字符串的相等比较

文章目录1 字符串的相等比较1.1 代码分析1 字符串的相等比较 如果有字符串s1 “Hello”; s2 “Hello” ; 在我们看来s1与s2相等。但是如果使用 “” 来判断是不准确的。因为在代码中s1与s2是是不同的字符串&#xff0c;它们位于不同的内存空间&#xff08;当然&#xff0c;…

3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】

2010-10-07 21:39 by 通用权限组件源码, 16580 visits, 收藏, 编辑 十一休假&#xff0c;杭州西湖边逛了一圈只能用人山人海来形容&#xff0c;浙大紫金港校区也逛了一圈风景如画&#xff0c;建设得真不错很棒&#xff0c;假期就去了这2个地方&#xff0c;然后在家里陪老婆、看…

【C语言进阶深度学习记录】二十八 数组指针与指针数组的分析

数组指针与指针数是非常重要的概念。面试中也是经常会被问到的 文章目录1 数组的类型1.1 定义数组的类型2 数组指针2.1 数组类型和数组指针的代码分析3 指针数组3.1 指针数组代码案例分析4 总结1 数组的类型 C语言中的数组有自己特定的类型。比如 int a[5]&#xff1b; 数组a…

(运维日志)在win7安装Oracle并部署Oracle数据库

部署环境说明&#xff1a; 操 作 系 统&#xff1a;window 7 Oracle 管理应用: pl sql 1 选择支持win7的Oracle版本,下载 目前完全支持win7 操作的oracle 版本为11.2 g 补充说明:Oracle 10g版本发布时间为2003年 Oracle 11g 版本发布时间为2007年 这两个版本在win7操作系统中安…

【C语言进阶深度学习记录】二十九 main函数与命令行参数

文章目录1 main函数的返回值2 main函数的参数2.1 main函数的参数的代码案例分析3 main函数不一定是程序中第一个执行的函数4 总结1 main函数的返回值 main函数是操作系统调用的函数操作系统总是将main函数的返回值作为程序的退出状态main函数的返回值正常来说是0&#xff0c;如…

【C语言进阶深度学习记录】三十 二维数组与二维指针

文章目录1 二维指针&#xff08;指向指针的指针&#xff09;2 二维数组3 二维数组的类型3.2 如何动态申请二维数组4 总结1 二维指针&#xff08;指向指针的指针&#xff09; 指针的本质是变量指针的指针是保存指针变量的地址。如下面的代码&#xff1a; 为什么需要指向指针的存…

Windows Phone 7 开发积累_04

关于产生错误 “The as operator must be used with a reference type or nullable type (System.DateTime is a non-nullable value type) ” 今天写数据转换器&#xff0c;需要将按照时间值显示不同的时间格式字符串。 结果在Convert里发现这么写报错。 public object Conve…

【C语言进阶深度学习记录】三十一 数组作为函数参数时退化为指针

之前的学习数组的文章中&#xff0c;已经知道一维数组作为函数参数的时候&#xff0c;最终会被编译器编译为指针。今天来看看二维数组的情形 文章目录1 为什么C语言中的数组作为函数参数会退化为指针&#xff1f;2 二维数组作为函数参数如何退化2.1 代码案例分析&#xff08;传…

使用HTMLParser模块解析HTML页面

HTMLParser是python用来解析html和xhtml文件格式的模块。它可以分析出html里面的标签、数据等等&#xff0c;是一种处理html的简便途径。HTMLParser采用的是一种事件驱动的模式&#xff0c;当HTMLParser找到一个特定的标记时&#xff0c;它会去调用一个用户定义的函数&#xff…

前端学习(294):rem小实例

altz转换为rem <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible"…

【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数

回调函数是非常重要的概念 文章目录1 函数的类型2 函数指针2.1 函数指针的使用2.2 使用函数指针实现回调函数3 总结1 函数的类型 跟以前学数组的时候是一样的&#xff0c;C语言中的数组是有自己的类型的。函数也是有自己的类型的。 函数的类型由返回值、参数的类型、参数的个…

tabs标签切换

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><head> <title>用户信息</title>…

【C语言进阶深度学习记录】三十三 C语言中动态内存分配

如何在程序运行的时候动态给程序分配内存&#xff1f; 文章目录1 动态内存分配的意义1.1 C语言中如何动态申请内存空间1.2 malloc和free的用法1.3 calloc与realloc1.31 calloc和realloc的代码案例分析2 总结1 动态内存分配的意义 在C语言中&#xff0c;一切操作都是基于内存的…

[Cocoa]深入浅出Cocoa之Core Data(2)- 手动编写代码

深入浅出Cocoa之Core Data&#xff08;2&#xff09;- 手动编写代码 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议前面详细讲解了 Core Data 的框架以及设计的类&#xff0c;下面我们来讲解一个完全手动编写代码使用这些类的示…

java并发实战

推荐一个Java并发编程实战的学习专栏。此专栏为极客时间收费专栏。 学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群 &#xff1a; 962535112 对于一个 Java 程序员而言&#xff0c; 能否熟练掌握并发编程是判断他优秀与否的…

a critical review of preetham skylight model 笔记

也是为了试用下Xmind。 上图是我用Xmind作的某篇文章的笔记。 感想&#xff1a; 1. 之以一直觉得这种东西没多大用处&#xff0c;回想起来大概是因为那时没有太多应用场景。 2. 如果留心&#xff0c;可以把许多事情做得更漂亮、更容易&#xff0c;这也是工具的用途。 贴一下软件…

【C语言进阶深度学习记录】三十四 C语言实现内存泄漏检测模块

上一篇文章学习了malloc系列的三个函数的使用。众所周知malloc的使用很容易导致内存泄漏。本文的目的就是使用C语言来实现内存泄漏检测模块&#xff0c;来帮忙自动检测我们写的程序中是否出现内存泄露。 文章目录1 内存泄露检测模块的实现原理1.1 各个函数模块的设计1.2 模块整…

用cookie实现叶卡的记忆功能

之前在写叶卡切换的时候总需要把js代码写到html标签里面。 后来接触了闭包后知到一点点怎么通过闭包实现该功能。 之后又想通过cookie来记忆叶卡的当前位置。 代码如下&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/…

重学前端----前端知识系统学习推荐专栏

推荐一个前端知识学习专栏。此专栏为极客时间收费专栏。 学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 文章目录1 概述2 专栏内容2.1 模块一&#xff0c;JavaScript2.2 模块二&#xff0c;HTML 和 …