C语言字符串、字符数组与字符串常量——各种奇奇怪怪的偏难怪

文章目录

  • 一、字符串
  • 二、字符数组
  • 三、字符串常量(字符指针)
  • 易错点
  • 总结


一、字符串

在C语言中,没有专门的字符串变量,没有string类型。
字符串定义有两种方法:一是利用字符数组,二是利用字符指针 。

字符串是指由一对双引号(“”)括起来的字符序列。例如char str[6] = “Hello”;

也可以不指定数组长度。例如char str[] = “Hello”;

字符串的结束标记为’\0’或’0’,因为’\0’的ASCII码值为’0’。

由" "包围的字符串会自动在末尾添加’\0’。例如,"abc123"从表面看起来只包含了 6 个字符,其实不然,C语言在最后隐式地添加一个’\0’,这个过程是在后台默默地进行的。
但逐个字符地给数组赋值并不会自动添加’\0’

二、字符数组

字符数组是存储连续字符的内存空间。

字符数组不一定能构成字符串

例:
char str[] = {‘a’,‘b’,‘c’}; 无法组成字符串
char str[] = {‘a’,‘b’,‘c’,‘\0’}; 可以组成字符串
char str[5] = {‘a’,‘b’,‘c’}; 可以组成字符串(因为给了5的容量,但元素只有3个,后面值为0,对应为’\0’)
char str[5] = “abc”;可以组成字符串
char str[] = “abc”;可以组成字符串
char str[] = {‘a’,‘b’,‘c’,‘\0’,‘c’}; 可以组成字符串(有’\0’就可以)

是%s 格式是用于输出字符串的,它需要从一个地址开始(str 数组名代表的是一个地址)连续输出每一个字符的影像,直到遇到一个结束标记才能停下来。这个结束标记就是 0 号的字符编码。通常这个 0 号字符编码我们用字符型的 8 进制常量的方式表示即’\0’。

也就是说:char str[] = {‘a’,‘b’,‘\0’,‘c’,‘\0’};则 str 数组所存储的字符串为 ab

定义字符数组是也可以对部分元素赋初值,此时,未被赋初值部分将被赋值为0,字符为空格。

字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符一个字符地赋值了。

//错误(因为str是数组名是一个地址,是一个指针常量,是不可以被修改的)
char str[7];
str = "abc123";  
//正确
str[0] = 'a'; str[1] = 'b'; str[2] = 'c';
str[3] = '1'; str[4] = '2'; str[5] = '3';

三、字符串常量(字符指针)

类似于:char* p1 = “Hello”;

char str1[] = "Hello";
char* p1 = "Hello";
char* p2 = "Hello";

正常的字符数组会把常量区的Hello\0的内容复制进str1在栈区的内存空间中。
而于p1是指针变量,又由于字符串常量在源代码中代表了其所在常量区的地址,p1保留这个地址,所以通过p1就可以找到这个字符串常量。如果此时给它赋值(例p1[0] = ‘h’;),会执行失败。因为p1指向的是常量区的地址,常量区的内容是不可以被修改的。
但是可以p1 = “world”;,因为p1是指针变量,它们可以指向任意的字符串。
在这里插入图片描述

例:

//下面叙述错误的是()
char acX[]="abc";
char acY[]={'a','b','c'};
char *szX="abc";
char *szY="abc";

正确答案为:szX的内容修改后,szY的内容也会被更改

解释:
acX , acY 是2个数组,属于变量,一般存在栈区,可以修改, szX , szY 是2个指针指向常量区,常量区的东西不能被修改,所以是错误的

例:
以下叙述中正确的是()
语句 char str[10] = “string!”; 和 char str[10] = {“string!”}; 并不等价(错误)
答案为
对于字符串常量 “string!”,系统已自动在最后加入了"\0"字符,表示串结尾

易错点

易错点:
sizeof 函数求得是占据内存大小,strlen 函数求的是实际长度。


总结

这就是我大概的理解,字符串这里虽然看似简单,但里面弯弯绕还是不少的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机考研|一个很上头的408复习法(可实操)

因为408越复习,越轻松,这就是408上头的原因 408一开始复习肯定是有难度的,这也是408非常劝退的原因之一,但是如果你是科班出身,学完408第一遍之后,你就会轻松很多,因为408的内容虽然多&#xf…

详解数据库、Hive以及Hadoop之间的关系

1.数据库: 数据库是一个用于存储和管理数据的系统。数据库管理系统(DBMS)是用于管理数据库的软件。数据库使用表和字段的结构来组织和存储数据。关系型数据库是最常见的数据库类型,使用SQL(Structured Query Language…

【决策树】预测用户用电量

决策树预测用户用电量 文章目录 决策树预测用户用电量  👉引言💎一、 数据预处理数据预处理初步数据分析 二、 机器学习算法决策树回归预测用电量决策树模型介绍:回归预测 三、 可视化结果四、 数据分析与结论代码如下 👉引言&a…

如何快速分析OB集群日志,敏捷诊断工具obdiag分析能力实践——《OceanBase诊断系列》之四

1. 前言 obdiag是OceanBase的敏捷诊断工具。1.2版本中,obdiag支持快速收集诊断信息,但仅有收集能力是不够的,还需要有分析能力。因此在obdiag的1.3.0版本中,我们加入了OB集群的日志分析功能。用户可以一键进行集群的OB日志的分析…

arcgis 栅格数据处理2——栅格转地级市(栅格转矢量图)

1. 获取空间分析权限(解决无法执行所选工具问题) 选中“自定义”中的“扩展模块” 在弹出的模块中选中能选的模块,此处需要选择“spatial analysis”以进行下一步分析 3. 将栅格数据转为整数型(解决无法矢量化) 选…

弹性布局(下),过渡

弹性布局 1.当子元素在主轴方向的长度和大于父元素的情况 子元素在父元素中放不下是否换行? flex-warp: 默认值: nowrap 不换行,压缩子元素的长度,最常用 可选值: wrap 换行 当子元素被压缩时&#xff0…

AndroidStudio跑马灯实现

在activity_main.xml中编写如下代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_h…

(001)UV 的使用以及导出

文章目录 UV窗口导出模型的主要事项导出时材质的兼容问题unity贴图导出导出FBX附录 UV窗口 1.uv主要的工作区域&#xff1a; 2.在做 uv 和贴图之前&#xff0c;最好先应用下物体的缩放、旋转。 导出模型的主要事项 1.将原点设置到物体模型的底部&#xff1a; 2.应用修改器的…

数字化转型导师坚鹏:科技金融政策、案例及发展研究

科技金融政策、案例及发展研究 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚科技金融有哪些利好政策&#xff1f; 不知道科技金融有哪些成功案例&#xff1f; 不知道科技金融未来发展方向&#xff1f; 课程特色&#xff1a; 以案例的方式解读原创方…

15. 三数之和 - 力扣

1. 题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 …

基于springboot+vue的食品安全管理系统(源码+论文)

目录 前言 一、功能设计 二、功能实现 1 首页 2 后台登录 3 食品信息添加页面 4 食品查询 三、库表设计 四、论文 前言 从事食品行业的商家可能会对于食品的储存以及食品的销售&#xff0c;都有着不同门道的想法&#xff0c;那么如何能将这些想法一一实现&#xff0c;…

阿里云一键登录(号码认证服务)

前言 用户登录原来的登录方式如下 1. 手机号验证码 2. 账号密码 运营觉得操作过于复杂, 因此想引入阿里自动登录的逻辑, 也就是号码认证服务,所以才有了这篇问文章 注: 本文只是记录Java端的实现, app端的请自行查询文档实现 官方资料 文档 : 什么是号码认证服务_号码认证服务(…

python的generator生成器用法测试

yield、send、threw、close # coding: utf8# 生成器 def gen(n):for i in range(n):yield ig gen(5) # 创建一个生成器 print(g) # <generator object gen at 0x10bb46f50> print(type(g)) # <type generator># 迭代生成器中的数据(只有执行for循环…

Java代码审计安全篇-常见Java SQL注入

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计&#xff0c;记录自己的学习过程&#xff0c;还希望…

Unity L屏幕实现方式(已抛弃)

效果 右侧主要的参数&#xff1a;Line参数能够调整中间线的高度&#xff0c;PointXY能够调整整个下方弯曲图像的比例。 使用的是RenderTexture填充RawImage显示的方式&#xff0c;需要将一张RenderTexture设置位摄像机的输出内容。 ShaderGraph 由于这个采用了一定的数学模型…

「蓝桥·算法双周赛」第七场分级赛——小白入门赛

题目列表 说明 好久没打蓝桥杯的比赛&#xff0c;回来试试水&#xff0c;就开了第1、2、3一共三个题&#xff0c;第4题可惜了。1.thanks,mom【算法赛】 思路&#xff1a; 没什么好说的&#xff0c;但是当时比赛刚开始服务器有问题&#xff0c;基本提交的全WA了。#include <…

测试工具使用技巧01-->jmeter链接mysql

前言 在做接口或者性能测试的时候&#xff0c;有时需要jmeter连接数据库做操作&#xff0c;可以看看如下实例。操作实例 在mysql数据库中有如下数据表 在jmeter导入jdbc驱动插件&#xff08;需要的留言找我拿&#xff09; 在jmeter测试计划元件最下面&#xff0c;导入jdbc.…

外泌体相关基因肝癌临床模型预测——2-3分纯生信文章复现——03.差异表达基因筛选(2)

内容如下&#xff1a; 1.外泌体和肝癌TCGA数据下载 2.数据格式整理 3.差异表达基因筛选 4.预后相关外泌体基因确定 5.拷贝数变异及突变图谱 6.外泌体基因功能注释 7.LASSO回归筛选外泌体预后模型 8.预后模型验证 9.预后模型鲁棒性分析 10.独立预后因素分析及与临床的…

React__ 二、React状态管理工具Redux的使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言redux状态管理安装redux创建文件 并使用传参action 总结 前言 redux状态管理插件的使用 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考…

VRRP与BFD在项目中的结合使用

学习目标&#xff1a; 1. VRRP双网关热备份怎样部署&#xff1f; 2. BFD是一种怎样的检测技术&#xff1f; 3. VRRP与BFD联动实现故障的快速切换&#xff1b; 虚拟一个192.168.1.1的网关&#xff1a; 虚拟路由器冗余协议&#xff1a;VRRP 人为调节角色选举 流量分担是可以的&…