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二叉树的层序遍历 我也写过题解,可以先看看学习一下,如果会做层序遍历了,那么这题相对来说会简单很多。 具体题目 给你一棵…

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

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

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

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

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

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

音视频入门基础: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 参数获取到对应…

加密micropython写的程序为.mpy的方法

2024年7月26日 用虚拟机安装一个Linux,本例为CentOS7的Linux系统。 1.保证Linux能够连接网络。 2.进入root用户,使用下面的命令行安装gcc编译器: yum install gcc 3.安装完成后,查看gcc是否安装成功,用下面的命令…

家政项目小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,家政人员管理,家政服务管理,咨询信息管理,咨询服务管理,家政预约管理,留言板管理,系统管理 微信端账号功能…

前端开发知识-vue

大括号里边放键值对,即是一个对象。 一、vue可以简化前端javascript的操作。 主要特点是可以实现视图、数据的双向绑定。 使用vue主要分为三个步骤: 1.javascript中引入vue.js 可以src中可以是vue的网址,也可以是本地下载。 2.在javasc…

FastAPI(七十九)实战开发《在线课程学习系统》接口开发-- 加入课程和退出课程

源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 加入课程 我们先看下加入课程 1.是否登录 2.课程是否存在 3.是否已经存在 4.添加 首先实现逻辑 def get_student_course(db: Session, course: int…