C++指针解读(6)-- 指针和字符串

1、字符串的基本概念

(1)字符串的存储

字符串是存放在字符数组中的。比如字符串“hello”,在内存中是这么存放的:

这里要注意,在字符串的最后会加上一个'\0',也被称为NUL字符,表示字符串的结束位。比如定义char str[] = "hello",则sizeof(str)的长度是6,不是5。

(2)字符串的访问

既然字符串是字符按数组的方式存储的,我们可以用访问一维数组的方式来访问字符串。

char str[] = "hello";
printf(" %c\n", str[1]);char* ch = &str[1];
printf(" %c\n", *ch);

(3)字符串常量池

用char数组str[]的方式定义字符串,我们也可以用下面的方式定义一个字符串:

char *str = "hello";

这里的str其实是一个char*型的指针变量,它指向字符串"hello"的首地址。

这种方式定义字符串时,"hello"是字符串常量,这个常量就放在字符串常量池中。

我们可以用代码来验证下:

const char* pstr1 = "hello";
const char* pstr2 = "hello";
printf(" p1 = %p, p2 = %p\n", pstr1, pstr2);

运行后发现pstr1, pstr2这2个地址是相同的,且每次运行地址都一样。这说明这个字符串常量是编译时就确定好的。

(4)sizeof()和strlen()

sizeof是C语言中的一个单目运算符,用来计算数据类型所占空间的大小,单位为字节;而strlen是一个函数,用来计算字符串长度(不包括字符串结束位NUL)。

char str1[] = "hello";
char str2[10] = "hello";
printf(" sizeof(str1) = %d, strlen(str1) = %d\n", sizeof(str1), strlen(str1));
printf(" sizeof(str2) = %d, strlen(str2) = %d\n", sizeof(str2), strlen(str2));

2、定义字符串的几种方式

(1)char str[] = {'h', 'e', 'l', 'l', 'o', '\0'};

定义了一个字符数组,长度为6,数组里的元素分布如下:{'h', 'e', 'l', 'l', 'o', '\0'}。

假如末尾没有NUL字符:char str[] = {'h', 'e', 'l', 'l', 'o' };

printf()输出str的值会是什么呢?sizeof()和strlen()的值分别是什么呢?

char str1[] = { 'h', 'e', 'l', 'l', 'o' };
printf(" %s\n", str1);
printf(" sizeof(str1) = %d, strlen(str1) = %d\n", sizeof(str1), strlen(str1));

这时,输出的str1是hello+一些乱码;sizeof(str1)是5,而strlen(str1)的值是个变数,每次的输出不一定相同。

因为字符串是以NUL作为字符串结束位的,现在缺少这个结束位,程序就没有办法做出正确的处理了。

(2)char str[] = "hello";

定义了一个字符数组,长度为6,系统会在末尾自动加上字位结束符NUL。

(3)char *pstr = "hello";

定义了一个字符指针变量,指向常量池中的字符常量"hello"。

4、字符指针变量和字符数组的比较

char *str1定义的是一个字符指针变量;char str2[10]定义的是一个字符数组,数组名代表数组元素首地址。

这是两个不同的概念,主要有以下区别:

(1)字符指针变量存放的是地址,指向字符串的第一个元素;字符数组就是一个存放字符的数组,一个元素就是一个字符。

(2)字符指针变量的值是可以改变的,但字符数组名的值不能改变(它只代表数组的首地址)。

const char *str1 = "hello";
printf(" %c\n", *str1);str1++; //可以更改
printf(" %c\n", *str1);char str2[10] = "hello";
str2++; //报错

(3)字符指针指向的字符串的内容不能被更改,但字符数组中各元素的值可以被更改。

const char *str1 = "hello";
str1[2] = 'a'; //报错char str2[10] = "hello";
str2[2] = 'a'; //可以

(4)我们可以用str2[1], *(str2 + 1)这样的方式访问数组元素;对于字符指针变量,同样也可以用str1[1], *(str1 + 1)这样的方式访问。

const char *str1 = "hello";
printf(" %c, %c \n", str1[1], *(str1 + 1));char str2[10] = "hello";
printf(" %c, %c \n", str2[1], *(str2 + 1));

(5)初始化的含义

char *str1 = "hello";

等价于:

char *str1;
str1 = "hello"; //把字符串的首地址给str

但字符数组的初始化:

char str2[10] = "hello";

不等价于:

char str2[10];
str2 = "hello"; //报错

其实这里的str1是个char *类型的指针变量,即字符指针变量,把字符数组的首地址赋给这个指针变量是没问题的。

而str2是数组的名字,代表字符数组首元素的地址,我们可以给这个地址赋值,但不能让地址去指向另外一个地址。

char str1[10];
*str1 = 'h'; //可以给地址赋值
strcpy(str1, "hello"); //可以直接内存拷贝

5、字符指针作函数参数

前面我们知道可以用两种方式来定义字符串,一种是字符数组,另一种是字符串指针变量。当函数的形参是字符串时,我们可以传字符数组的首地址,也可以传字符串指针变量。

(1)传字符数组的首地址

void print_str(char str[]) {int i = 0;while (str[i] != '\0') {printf("%c", str[i]);i++;}
}int main()
{const char *str1 = "hello";print_str((char*)str1);char str2[10] = "hello";print_str(str2);return 0;
}

(2)传字符串指针变量

void print_str(char* str) {int i = 0;while (str[i] != '\0') {printf("%c", str[i]);i++;}
}

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

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

相关文章

Liunx中系统安全及文件系统(极其粗糙版)

系统安全: 系统安全和数据防护,数据备份的资质 比如三台服务器: 500万 工信部是有要求的,组织必须保证处理的个人数据的安全性 品牌形象如何维护呢 基于liunx的安全加固措施: 权限进行控制 账号安全:…

09_Webpack打包工具

1 初识Webpack 1.1 什么是Webpack Webpack打包工具对项目中的复杂文件进行打包处理,可以实现项目的自动化构建,并且给前端开发人员带来了极大的便利。 目前,企业中的绝大多数前端项目是基于Webpack打包工具来进行开发的。 1.2 Webpack的安…

C++学习——引用详解

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 一、引用的语法 1、引用的含义 引用(Reference)是 C 相对于C语言的又一个扩充。 引用可以看做是数据的一个别名,通过这个别名和原来的名字都能够…

可观测 AIOps 的智能监控和诊断实践丨QCon 全球软件开发大会总结

作者:董善东(梵登) 本文是作者于 9 月 5 日在 QCon 北京 2023(全球软件开发大会)上做的《阿里云可观测 AIOps 的智能监控和诊断实践》专题演讲文字版。 大家上午好,很高兴可以在 QCon 稳定性和可观测的场…

华为云云耀云服务器L实例评测|华为云耀云服务器L实例评测用例(五)

六、华为云耀云服务器L实例评测用例: “兵马未动,粮草先行”,随着企业业务的快速发展,服务器在数字化建设体系至关重要,为了保证服务器的稳定性、可靠性,需要对服务器进行评测,以确保服务器能够…

FPC柔性电路板介绍及PCB设计经验规则总结

🏡《总目录》 目录 1,概述2,FPC的特点3,FPC设计十五条经验规则4,总结1,概述 FPC软板由于具有可弯曲折叠的特点,当前在消费电子,汽车电子和航空航天领域应用广泛。本文详细介绍FPC的特点并对FPC板设计中需要注意的经验原则进行总结。 2,FPC的特点 FPC的全称是Flexibl…

网站如何应对网络流量攻击

网络安全问题中,受到流量攻击是一种常见挑战。以下是一系列的专业建议,帮助您预防和减轻这类攻击,从而确保您的网站和数据的安全。 使用 Web 应用程序防火墙 (WAF) Web 应用程序防火墙是一项专门的安全工具,能够检测和拦截恶意流…

【Docker 内核详解】namespace 资源隔离(五):User namespaces

【Docker 内核详解 - namespace 资源隔离】系列包含: namespace 资源隔离(一):进行 namespace API 操作的 4 种方式namespace 资源隔离(二):UTS namespace & IPC namespacenamespace 资源隔…

项目管理软件中注释功能的作用是什么?

在项目管理软件中,注释功能允许您对任务、文件夹和项目进行详细的标注。这一功能不仅便于团队成员之间的沟通与协作,还能提高项目管理的效率。通过在项目中添加评论,您可以及时了解项目的最新动态,提出疑问并寻求解决方案。此外&a…

汇编语言基础

引言 汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有效的应用汇编语言对其编程。汇编课程的研究重点放在如何利用硬件系统的编程结构和指令集有效灵活的控制系统进行工作。 基础知识 1.1机器语言 机器语言是机器指令的集合…

单链表---结构体实现

定义 链表称为线性表的链式存储,顺序表逻辑上相邻的数据,存储位置也相邻。链表逻辑上相邻的数据,存储位置是随机分布在内存的各个位置上的。 故 对于每一个结点,定义的结构体是: typedef struct _LinkNode {int d…

Java-使用sqlSessionTemplate实现批量更新-模拟mybatis 动态sql

环境准备(非核心方法) 创建表 创建表的sql(下表是基于Oracle创建的) CREATE TABLE "SYSTEM"."STUDENT" ("ID" NUMBER(10, 0),"NAME" VARCHAR2(20 BYTE),"ADDRES" CLOB,PRIMARY KEY ( …

milvus和相似度检索

流程 milvus的使用流程是 创建collection -> 创建partition -> 创建索引(如果需要检索) -> 插入数据 -> 检索 这里以Python为例, 使用的milvus版本为2.3.x 首先按照库, python3 -m pip install pymilvus Connect from pymilvus import connections c…

mac电脑版数字图像处理软件:ACDSee Photo Studio 9最新 for Mac

ACDSee Photo Studio 9是一款由ACD Systems开发的功能强大的照片管理和编辑软件,专为Mac用户提供一站式解决方案,方便用户轻松浏览、管理和编辑照片。该软件提供了许多实用的工具和功能,包括高效的导入和排序工具、强大的编辑工具、智能组织和…

CustomTabBar 自定义选项卡视图

1. 用到的技术点 1) Generics 泛型 2) ViewBuilder 视图构造器 3) PreferenceKey 偏好设置 4) MatchedGeometryEffect 几何效果 2. 创建枚举选项卡项散列,TabBarItem.swift import Foundation import SwiftUI//struct TabBarItem: Hashable{ // let ico…

Java练习题-获取数组元素最大值

✅作者简介:CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1🏆 📃个人主页:hacker707的csdn博客 🔥系列专栏:Java练习题 💬个人格言:不断的翻越一座又…

Qt之给控件添加右键菜单

一、设置控件 在对应控件的属性中,将contextMenuPolicy设置为CustomContextMenu。 二、添加槽函数 在对应控件上右键选择槽函数customContextMenuRequested(QPoint)。 三、在槽函数中添加右键菜单 在槽函数中输入如下代码,添加右键菜单。 //右键菜单 …

Flutter 剪裁(Clip)

🔥 ClipOval 🔥 子组件为正方形时剪裁成内贴圆形;为矩形时,剪裁成内贴椭圆 裁剪纯色背景 ClipOval(child: Container(width: 300.w,height: 300.w,decoration: const BoxDecoration(color: Colors.red),),), 裁剪背景图片 裁剪前…

《Deep Residual Learning for Image Recognition》阅读笔记

论文标题 《Deep Residual Learning for Image Recognition》 撑起CV界半边天的论文Residual :主要思想,残差。 作者 何恺明,超级大佬。微软亚研院属实是人才辈出的地方。 初读 摘要 提问题: 更深层次的神经网络更难训练。 …

(vue3)大事记管理系统 文章管理页

[element-plus进阶] 文章列表渲染(带搜索&到分页) 表单架设:当前el-form标签配置一个inline属性,里面的元素就会在一行显示了 中英国际化处理:App.vue中el-config-provider标签包裹组件,意味着整个组…