char *str,char str,char * str和char str的区别

1.char *str一个指向字符或字符串的指针,总是指向一个字符的起始地址,例如

char *str = "Hello";
cout << *str << endl;  // 输出:H
cout << str << endl;   // 输出:Hello
str ="World";         //指针变量本身地址没有改变,只是改变了指针指向的常量字符串地址
cout<< str <<endl;    //输出:World

2.char &str一个字符的引用,可以看作是字符的别名,对引用的修改可以直接影响原始值,例如 

char c = 'A';
char &str = c;
cout << str << endl;  // 输出:A

str = 'B';
cout << c << endl;    // 输出:B

对于函数中调用char *str和char &str的区别 

#include <iostream>
#include <cstring>
using namespace std; 

void ModifyPointer(char *str) {
    str = "World";  // str是指向字符串的起始位置,而不是字符串本身,所以这样写是错误的,会返回原值
}

void ModifyPointerone(char *str){
    strcpy(str,"World");	//新的字符串内容复制到已存在的字符数组中 
}

void ModifyPointertwo(char *str){
	str[0]='P';			//改变字符串中起始位置的值,其余不变 
}

void ModifyPointerthree(char *str){
	str[2]='P';			//改变字符串中起始位置的值,其余不变 
}

void ModifyReference(char &str) {
    str = 'B';     // 修改引用的值,让它引用到另一个字符
}

void ModifyReferenceone(char &str) {
    strcpy(str,"world");     // 报错,只能修改一个字符
}


int main() {
    char greeting[] = "Hello";

    char *ptr = greeting;
    cout << ptr << endl;  // 输出:Hello

	ModifyPointer(ptr);
    cout << *ptr << endl;	//输出:H,指针指向字符的起始位置 
    
    ModifyPointer(ptr);
    cout << ptr << endl;  // 输出:Hello,指针的值未改变
    
    ModifyPointerone(ptr);
    cout <<ptr <<endl;		//输出:World,指针指向改变 
    
    ModifyPointertwo(ptr);
	cout <<ptr <<endl; 		//输出: Porld,指针的起始位置改变 
   
	ModifyPointerthree(ptr);
	cout <<ptr <<endl; 		//输出:PoPld,指针的三个值改变 
	
    char &ref = greeting[0];
    cout << ref << endl;  // 输出:P

    ModifyReference(ref);
    cout << ref << endl;  // 输出:B,引用的值被修改

	ModifyReferenceone(ref);
    cout << ref << endl;
	
    return 0;
}

 其中最重要的三点

•*str可以对字符或字符串进行改变

void ModifyPointerone(char *str){
    strcpy(str,"World");	//新的字符串内容复制到已存在的字符数组中 
}

void ModifyPointertwo(char *str){
	str[0]='P';			//改变字符串中起始位置的值,其余不变 
}

•&str只能使一个字符改变 

    char &ref = greeting[0];
    cout << ref << endl;  // 输出:P

    void ModifyReference(char &str) {
    str = 'B';     // 修改引用的值,让它引用到另一个字符
    }

    ModifyReference(ref);
    cout << ref << endl;  // 输出:B,引用的值被修改

•函数的参数调用和主函数中的引用

char *str = "Hello";
cout << str << endl;   // 输出:Hello
str ="World";         //指针变量本身地址没有改变,只是改变了指针指向的常量字符串地址
cout<< str <<endl;    //输出:World


void ModifyPointer(char *str) {
    str = "World";  
// 参数str是指向字符串的起始位置,而不是字符串本身,所以这样写是错误的,会返回原值
}

补充:char *&str,char **str与char *str的区别

char *str:存储char类型对象的地址

char **str:是一个指向指针的指针,用于表示一个指针数组

可以看作char* *str:str是一个指针,指向的类型是char*

char *&str:声明了一个指向指针的引用,可以修改指针本身所指向的地址。

示例代码 

#include <iostream>
using namespace std;

void ModifyStringArray(char** str) {
    // 修改字符串数组中的第一个元素
    str[0] = "Modified";
}

void ModifyStringPointer(char*& str) {
    // 修改指向字符串的指针
    str = "Modified";
}

int main() {
    char* strArray[] = { "One", "Two", "Three" };

    char** ptrToStrArray = strArray;
    ModifyStringArray(ptrToStrArray);
    cout << strArray[0] << endl;  // 输出 "Modified"

    char* strPtr = strArray[1];
    ModifyStringPointer(strPtr);
    cout << strArray[1] << endl;  // 输出 "Modified"

    return 0;
}

由上可以看出char ** 和char *&可以完成同样的效果,但是写法是不同的

3.char str是一个单个字符的变量,储存一个字符的值,例如

char str = 'C';
cout << str << endl;  // 输出:C

str = 'D';
cout << str << endl;  // 输出:D

💖💖如有错误请大佬们多多指教,谢谢大佬们!!💖💖

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

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

相关文章

V2board缓存投毒漏洞复现

1.什么是缓存投毒 缓存投毒&#xff08;Cache poisoning&#xff09;&#xff0c;通常也称为域名系统投毒&#xff08;domain name system poisoning&#xff09;&#xff0c;或DNS缓存投毒&#xff08;DNS cache poisoning&#xff09;。它是利用虚假Internet地址替换掉域名系…

SD WebUI 扩展:prompt-all-in-one

sd-webui-prompt-all-in-one 是一个基于 Stable Diffusion WebUI 的扩展&#xff0c;旨在提高提示词/反向提示词输入框的使用体验。它拥有更直观、强大的输入界面功能&#xff0c;它提供了自动翻译、历史记录和收藏等功能&#xff0c;它支持多种语言&#xff0c;满足不同用户的…

离谱的Bug

离谱的 Bug Bug 情况发现 Bug修改 Bug其他感受历史 Bug火星Spirit号Mars Global Surveyor任务 Bug 情况 有一次&#xff0c;我在开发一个网页应用程序时&#xff0c;遇到了一个令人目瞪口呆的Bug。这个Bug出现在一个特定的页面上&#xff0c;当用户点击某个按钮时&#xff0c;…

YOLOv5、YOLOv8改进:SOCA注意力机制

目录 简介 2.YOLOv5使用SOCA注意力机制 2.1增加以下SOCA.yaml文件 2.2common.py配置 2.3yolo.py配置 简介 注意力机制&#xff08;Attention Mechanism&#xff09;源于对人类视觉的研究。在认知科学中&#xff0c;由于信息处理的瓶颈&#xff0c;人类会选择性地关注所有…

【Golang系统开发】搜索引擎(2) 压缩词典

写在前面 这篇文章我们就给出一系列的数据结构&#xff0c;使得词典能达到越来越高的压缩比。当然&#xff0c;和倒排索引记录表的大小相比&#xff0c;词典只占据了非常小的空间。那么为什么要对词典进行压缩呢&#xff1f; 这是因为决定信息检索系统的查询响应时间的一个重…

【MyBatis面试题(20道)】

文章目录 MyBatis 面试题&#xff08;20道&#xff09;基础1.说说什么是MyBatis&#xff1f;2.Hibernate和MyBatis有什么区别&#xff1f;3.MyBatis使用过程&#xff1f;生命周期&#xff1f;4.在mapper中如何传递多个参数&#xff1f;5.实体类属性名和表中字段名不一样&#x…

计算机视觉之三维重建(二)(摄像机标定)

标定示意图 标定目标 P ′ M P w K [ R T ] P w P^{}MP_wK[R \space T]P_w P′MPw​K[R T]Pw​ 其中 K K K为内参数&#xff0c; [ R T ] [R \space T] [R T]为外参数。该式子需要使用至少六对内外点对进行求解内外参数&#xff08;11个未知参数&#xff09;。 其中 R 3 3 …

linux vscode 下开发

linux vscode 下开发 javajdk插件查看调用层次 java jdk 各种JAVA JDK的镜像分发 编程宝库 - 技术改变世界 jdk 镜像 ubuntu22.04 安装 # Linux x64 64位 jdk-8u351-linux-x64.tar.gztar -zxf jdk-8u351-linux-x64.tar.gz mv jdk1.8.0_351 jdk8/ vim ~/.pr…

[附源码]计算机毕业设计-JAVA火车票订票管理系统-springboot-论-文-ppt

PPT论文 文章目录 前言一、主要技术javaMysql数据库JSP技术 二、系统设计三、功能截图总结 前言 本论文主要论述了如何使用JAVA语言开发一个火车订票管理系统 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想…

升级家庭网络!Wi-Fi 7让你流畅体验网速飞快的3大原因

与我们的智能手机和笔记本电脑不同,即使是最好的Wi-Fi路由器也是我们家中最有可能被视为理所当然的技术——也就是说,直到出现问题。然而,一旦Wi-Fi 7成为主流,这种情况可能很快就会改变。 虽然从Wi-Fi 6到Wi-Fi 6E的飞跃引入了更快的6 GHz频段,但这还不足以让大多数人升…

vue使用

详解vue使用Echarts画柱状图_vue.js_脚本之家 Vue修改按钮间距使用 margin-left Vue3 定义变量 &#xff08;没有data了&#xff09; vue3的setup函数中定义data数据&#xff0c;使用data数据_vue3 data_半里_辰昏的博客-CSDN博客 const showFlag ref(false) 修改值&#…

Linux 黑话解析:什么是 LUKS 加密?

导读LUKS 是 Linux 用户中流行的磁盘加密机制。在这篇术语解析文章中&#xff0c;可以了解更多关于 LUKS 的信息。 计算机安全旨在保护私密信息。有许多方法可以保护系统。一些用户使用简单的用户名/密码登录方案进行基本保护。其他用户可能会通过加密以不同的方式增加额外的保…

【算法系列篇】双指针

文章目录 前言什么是双指针算法1.移动零1.1 题目要求1.2 做题思路1.3 Java代码实现 2.复写零2.1 题目要求2.2 做题思路2.3 Java代码实现 3.快乐数3.1 题目要求3.2 做题思路3.3 Java代码实现 4.盛最多水的容器4.1 题目要求4.2 做题思路4.3 Java代码实现 5.有效三角形的个数5.1 题…

并查集路径压缩(Java 实例代码)

目录 并查集路径压缩 Java 实例代码 UnionFind3.java 文件代码&#xff1a; 并查集路径压缩 并查集里的 find 函数里可以进行路径压缩&#xff0c;是为了更快速的查找一个点的根节点。对于一个集合树来说&#xff0c;它的根节点下面可以依附着许多的节点&#xff0c;因此&am…

【11】Redis学习笔记 (微软windows版本)【Redis】

注意:官redis方不支持windows版本 只支持linux 此笔记是依托微软开发windows版本学习 一、前言 Redis简介&#xff1a; Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据结构存储系统&#xff0c;它也被称为数据结构服务器。Redis以键值对&am…

Eureka:服务注册-信息配置-自我保护机制

首先在提供者服务下&#xff0c;添加一个依赖 <!-- Eureka --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId><version>1.4.6.RELEASE</version><…

大数据-玩转数据-Flink App市场推广统计

一、说明 电商网站中已经有越来越多的用户来自移动端&#xff0c;相比起传统浏览器的登录方式&#xff0c;手机APP成为了更多用户访问电商网站的首选。对于电商企业来说&#xff0c;一般会通过各种不同的渠道对自己的APP进行市场推广&#xff0c;而这些渠道的统计数据&#xf…

Spring Boot通过企业邮箱发件被Gmail退回的解决方法

这两天给我们开发的Chrome插件&#xff1a;Youtube中文配音 增加了账户注册和登录功能&#xff0c;其中有一步是邮箱验证&#xff0c;所以这边会在Spring Boot后台给用户的邮箱发个验证信息。如何发邮件在之前的文章教程里就有&#xff0c;这里就不说了&#xff0c;着重说说这两…

K8S应用笔记 —— 部署Dolphinscheduler及简单应用(二)告警通知

一、本章目标 演示Dolphinscheduler的告警通知功能&#xff0c;将SQL任务组件查询返回结果集指定为邮件通知内容&#xff08;支持为&#xff1a;表格、附件或表格附件三种模板&#xff09;。 二、 前提条件 已完成Dolphinscheduler部署 K8S集群部署&#xff0c;可参考文章&a…

Docker容器:docker镜像的创建及dockerfile

Docker容器&#xff1a;docker镜像的创建及dockerfile案例 一.docker镜像的三种创建方法 创建镜像有三种方法&#xff1a;基于现有镜像创建、基于本地模板创建及基于dockerfile创建 1.基于现有镜像创建 1.1 启动镜像 #首先启动一个镜像&#xff0c;在容器里做修改 docker …