C++ - char*、const char*、char[]、string

const char*

const char* 用来定义字符串常量。

char[ ]

char型的字符数组是一种定长的数组,存储指定长度的字符序列,数组中的每个元素都是一个char类型的变量,如:

char arr[] = {'h', 'a', 'l', 'l', 'o', '\0'};
char c = arr[0];	// 访问数组的第一个元素‘h’

char*

char* 用来定义一个字符串,它指向字符数组的指针,指针的值是第一个字符的地址,字符串中的每个字符都是用连续的内存单元存储的。此时应该加上长度限制,如 char* str = new char[80];

char *str = “hallo”;

这里的str是一个指向字符数组的指针,指向以字符‘h’开始的内存单元,后面依次存放了其他字符,最后以‘\0’结尾。在使用指针指向的字符串时,我们通常使用指针访问字符串的每个字符,如:

char *str = "hallo";
char c = str[0];	// 访问字符串的第一个字符‘h’

char[]和char*的区别

1. 类型不同

char*是指针类型,用于表示一个指向字符数组开头的指针,而char[]是字符数组类型,用于表示一个字符数组。

2. 指向的内容能否修改

char* 声明的字符串常量在内存中是以只读的方式存储的,不能被修改;而char[]声明的字符数组可以修改。

3. 是否支持指针运算

char*可以进行指针运算,如++、–、+ 和 - 等操作;而char[]不支持这些操作。如:

char *str = “hallo”;
char c = *(str + 1);	// 通过指针运算访问字符串的第二个字符

str + 1 表示指向字符串中的第二个字符,然后使用 * 运算符来访问该字符的值。

4. 是否支持动态分配内存

char*可以进行动态分配内存,如使用 malloc()分配内存空间;而char[]声明的字符数组大小在编译时就已经确定,无法动态改变其大小。

5. 是否可以修改指向性

在函数参数中,char*表示一个指向字符数组的指针,可以被修改;而char[]表示一个字符数组,不能被修改,即char[]实际上是一个指向字符数组的指针,但它是一个常量指针,所以不能够被修改。

char* 类型的变量可以被修改,它指向的字符数据可以被修改;而char[]类型的变量则是一个常量指针,不能被修改。如:

// 合法代码
char str1[] = "hallo";
char *str2 = "China";str2 = str1;	// 可以修改指针指向的位置
str2[0] = 'a';	// 可以修改指针指向的位置上的字符数据// 不合法代码
char str3[] = "hallo";
char str4[] = "China";str4 = str3; // 不可以修改数组指针的指向
str4[0] = 'a'; // 可以修改数组指针指向的位置上的字符数据

char**

它定义了指向char*的指针,是二级指针,因为右边是数组,而数组的元素为char型指针,即为指向指针的指针,因此叫2级指针。

char** ppstr = new char*[80];。char** ppstr 代表指向内存首地址,也就是一个char指针的指针对ppstr可以用下标方式代表数组第几个元素,也就是第几个char指针的意思。

char*[80],因为[ ]的优先级高,所以它表示是一个数组,数组的元素为指针。
new char*[80],表示开辟了一块内存,存放80个char指针的内存空间,大小为sizeof(char) * 80 = 320个字节。

string

string是std::basic_string模板类的实例化,是一个类。string str = “abc”; 其实是const char*转class, string重载了“=”,把“abc”封装成std::string。

string、char*、char[ ]和const char*相互转换

在这里插入图片描述

Ps:
字符串、数组和指针有太多的地方需要探索,在以后刷题的过程中中,多多练习,慢慢的提高!

真的感觉很绕,即使我在整理的时候也要不断的停下来再思考。

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

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

相关文章

【二叉树 C++DFS】2458. 移除子树后的二叉树高度

本文涉及知识点 二叉树 CDFS LeetCode 2458. 移除子树后的二叉树高度 给你一棵 二叉树 的根节点 root ,树中有 n 个节点。每个节点都可以被分配一个从 1 到 n 且互不相同的值。另给你一个长度为 m 的数组 queries 。 你必须在树上执行 m 个 独立 的查询&#xff…

模式Hash和history

vuerouter有两种路由模式Hash和history。区别:Hash为默认模式,url中包含一个#符号的哈希部分。优势:兼容性好,不需要后端服务器的特殊配置。缺点:不够美观,搜索引擎优化较差。History模式使用的浏览器的His…

C# 写入SQLServer数据库报错SqlException: 不能将值 NULL 插入列 ‘ID‘

private int id; [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]//id自增 public int ID { get > id; set > id value; } 将ID属性下的标识规范由否改成是

STM32-寄存器时钟配置指南

目录 启动 SystemInit SetSysClock 总结 启动 从startup_stm32f0xx.s内的开头的Description可以看到 ;* Description : STM32F051 devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the in…

微信小程序支付流程

前端需要做的事情: 生成平台订单:前端调用接口,向后端传递购买的商品信息、收货人信息,(后端生成平台订单,返回订单编号)获取预付单信息:将订单编号发送给后端后,&#x…

Hadoop单机版环境搭建

一 . 案例信息 Hadoop 的安装部署的模式一共有三种: 本地模式,默认的模式,无需运行任何守护进程( daemon ),所有程序都在单个 JVM 上执行。由 于在本机模式下测试和调试 MapReduce 程序较为方便&#x…

leetocde662. 二叉树最大宽度,面试必刷题,思路清晰,分点解析,附代码详解带你完全弄懂

leetocde662. 二叉树最大宽度 做此题之前可以先做一下二叉树的层序遍历。具体题目如下: leetcode102二叉树的层序遍历 我也写过题解,可以先看看学习一下,如果会做层序遍历了,那么这题相对来说会简单很多。 具体题目 给你一棵…

第11章 Express即时通讯简单集成

在现代 Web 应用中,实时通信变得越来越重要,特别是对于需要实时数据更新的应用,比如聊天应用、实时通知、在线游戏等。Express 是一个灵活且强大的 Web 框架,通过结合 WebSocket 和 Socket.IO,可以轻松实现实时通信功能…

[OJ]水位线问题,1.采用回溯法(深度优先遍历求解)2.采用广度优先遍历求解

1.深度优先遍历 使用回溯法,深度优先遍历利用栈先进后出的特点,在加水控制水量失败时, 回到最近一次可对水进行加水与否的位置1.对于给定水量k,是否在[l,r]之间, 是:是否加水(加水y,用掉x,是否在[l,r]之间)(不加水y,用掉x,是否在[l,r]之间)先尝试加水,如…

Java 实现分页的几种方式详解

目录 分页概述Java实现分页的几种方式 手动分页基于JDBC的分页基于Hibernate的分页基于MyBatis的分页[基于Spring Data JPA的分页](#基于Spring Data JPA的分页)使用PageHelper插件的分页 分页中的注意事项总结 分页概述 分页是指将大量数据分成若干小块,每次只显…

NVIDIA全面转向开源GPU内核模块

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Logback原理及应用详解(三)

本系列文章简介: 在软件开发的过程中,日志记录是一项至关重要的功能。它不仅帮助开发者在开发阶段追踪代码的执行流程和调试问题,还在生产环境中扮演着监控应用运行状态、记录关键业务信息和排查故障的重要角色。随着软件系统的日益复杂和分布…

FastAPI(七十八)实战开发《在线课程学习系统》接口开发-- 评论

源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 梳理下思路 1.判断是否登录 2.课程是否存在 3.如果是回复,查看回复是否存在 4.是否有权限 5.发起评论 首先新增pydantic模型 class Cour…

python当键存在时向值添加元素,键不存在时则新建的简洁方法

在 Python 中,可以使用字典来存储集合对象,并且在键存在时向集合中添加元素,键不存在时则新建一个集合并添加元素。可以使用 dict.setdefault() 方法来简化这个过程,或者手动检查键是否存在。 下面是一些示例代码: 使…

音视频入门基础:WAV专题(2)——WAV格式简介

注:本文有部分内容引用了维基百科:https://zh.wikipedia.org/wiki/WAV 一、引言 Waveform Audio File Format(缩写WAVE或WAV)是微软与IBM公司所开发在个人电脑存储音频流的编码格式,在Windows平台的应用软件受到广泛的…

AI/机器学习(计算机视觉/NLP)方向面试复习3

1. Pooling 有哪些方式?pytorch的实现? Pooling可以分成:最大池化,平均池化,全局平均池化,随机池化,空间金字塔池化。 1. 最大池化(Max Pooling) 最大池化是最常用的池…

union的特性和大小端

一、union在c和c语言中的特性 1.共享内存空间:union的所有成员共享同一块内存空间。意味着在同一时刻,union 只能存储其成员 中的一个值。当你修改了union中的一个成员,那么其它成员的值也会被改变,因为它们实际上都是指向同一块…

JS逆向高级爬虫

JS逆向高级爬虫 JS逆向的目的是通过运行本地JS的文件或者代码,以实现脱离他的网站和浏览器,并且还能拿到和浏览器加密一样的效果。 10.1、编码算法 【1】摘要算法:一切从MD5开始 MD5是一个非常常见的摘要(hash)逻辑. 其特点就是小巧. 速度快. 极难被破解. 所以,…

skywalking docker部署

skywalking-oap # 拉取skywalking-oap镜像 docker pull apache/skywalking-oap-server:9.7.0# 启动容器 docker run --name oap \ -d \ -p 11800:11800 \ -p 12800:12800 \ apache/skywalking-oap-server:9.7.0skywalking-ui # 摘取skywalking-ui镜像 docker pull apache/sky…

大屏使用技巧——如何实现数据分发

当多个组件需共用同一数据源时,为了减少重复请求,需要进行数据分发。那如何实现接一次数据就能让多个组件映射同一数据源中的不同数据字段呢? 实现思路 目标组件的静态数据中添加标记字段,数据过滤器内通过 data 参数获取到对应…