C++ : C++基础 :从内存的角度看 char[]和char*

char*和char[]区别

  • 1:数据在内存中的存储
  • 2:char*和 char[]分析
  • 3:char* p2 和 char p1[]
    • 3.1 修改指针所指向的地址
  • 4: string转char*
  • 5: char * 转string
    • 5.1 to_string()用法

1:数据在内存中的存储

  1. 栈:就是在那些由编译器在需要的时候分配,在不需要的时候自动清楚变量的存储区,里面的变量通常是局部变量,函数参数等。
  2. 堆:就是那些由new或malloc分配的内存,在不使用的时候,要手动用 delete或free来释放内存区域
  3. 全局/静态存储区:全局变量和静态变量被分配到同一块内存中,他们共同占用同一块内存区域。
  4. 常量存储区:这是一块特殊存储区,他们里面存放的是常量,不允许修改

2:char*和 char[]分析

#include<iostream>
using namespace std;
int main()
{
	char* a = "abc";
	char b[] = {'a','b'};
	b[0] = 'b';
	a[0] = 'b';
	cout <<a << " "<< endl;
}

上述代码至少会有两个问题
问题1 :
char* a = “abc”;
在这里插入图片描述
分析:

  1. 等号右边的"abc"是一个不变常量,在c++中叫做string literal,type是const char *
  2. a则是一个char指针。如果强行赋值会发生什么呢?没错,就是将右边的常量强制类型转换成一个指针,结果就是我们在修改一个const常量。
  3. 编译运行的结果会因编译器和操作系统共同决定,有的编译器会通过,有的会抛异常,就算过了也可能因为操作系统的敏感性而被杀掉。

问题2:
在这里插入图片描述
因为"abc"在常量存储区中保存有一份,并且任何指向该存储器的任何写操作都是非法的。

💚💚💚

#include<iostream>
using namespace std;
int main()
{
	const char* a = "abc";
	char b[] = {'a','b'};
	b[0] = 'b';
	cout <<b[0] << " "<< endl;
}
但是上述代码是没有什么问题的
可以直接输出 :b

分析

  1. char b[3] = {‘a’,‘b’}的字符a和b是存放在栈区的所以可以进行写操作。
  2. 字符’a’, ‘b’ 是在 栈中开辟一段内存,内存的大小为3字节(char数组后面自动加一个 ‘\0’),然后 ‘a’, ‘b’ 被保存在栈中。

3:char* p2 和 char p1[]

从某种意义上来说, char p 和 char p[] 是没有区别 的,比如下面的代码:*

字符数组 char p1[] 编译器会在末尾自动加上’\0’ p1 = &p1[0] ; cout << p1 ;
直接输出这个字符串,本质就是通过这个地址 char *p 定义一个指针变量p,然后打印出这个变量指向的内存保存的值。

但是 char p1[] 和 char p2 又是有区别的。*

char* p2 是指向的常量区域是不能修改的
char[] p1 由于保存在栈中,是可以修改的,比如将 p1[0] 修改成 b"

#include<iostream>
int main()
{
	char p1[] = "hello java";
	const char *p2 = "hello C++";
	
	p1[0] = 'b';
	std::cout << p1 << std::endl << p2 << std::endl;
	std::cout << *p1 << std::endl <<p2[0] <<std::endl;
}

在这里插入图片描述

3.1 修改指针所指向的地址

修改p2的指,程序运行就会出错,但可以修改p2所指向的地址

#include<iostream>
int main()
{
	char p1[] = "hello java";
	const char *p2 = "hello C++";
	
	// 修改指针所指向的地址
	p2 = p1;
	std::cout << p2 << std::endl;
	std::cout << p1 << std::endl;
	return 0;
}

在这里插入图片描述

4: string转char*

#include<iostream>
#include<cstring>
int main()
{
	char t[10];
	//  error: 'string' was not declared in this scope
	// 这里需要带上 std命名空间。
	// answer :
	// 如果不使用using std::string,就在程序中使用string 类型变量,程序不能识别是标准库中的string 变量。
	// 因为程序自定义头文件中也可能含有string变量。所以一定要声明using std::string。这样程序里面的string类型变量就都是std标准库中的string变量了。
	std::string str = "abc";
	strcpy(t,str.c_str());
	std::cout<< t << std::endl;
	return 0;
}

在这里插入图片描述

5: char * 转string

#include<iostream>
#include<string>
int main()
{
    char t[10] = "abc";
    std::string str = t;
    std::cout << str;
	
	return 0;
}

在这里插入图片描述

5.1 to_string()用法

1: to_string()是标头的库函数,用于将数值(数字)转换为字符串。

原型
string to_string(numberic_value);
string:是返回类型,即函数返回一个字符串对象,其中包含字符串格式的数字值。
numbric_value:是可以为整数,浮点数,长整数,双精度数的数字。

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

int main ()
{
	//定义不同类型的数据类型
	int intVal =12345;
	float floatVal = 123.45f;
	long longVal = 123456789;

	//将值转换为字符串以打印
	cout<<"intVal (string format) : "<<to_string (intVal) <<endl;
	cout<<"floatVal (string format) : "<<to_string (floatVal) <<endl;
	cout<<"floatVal (string format) : "<<to_string (longVal) <<endl;

	return 0;
}

输出结果

intVal (string format) : 12345
floatVal (string format) : 123.449997
floatVal (string format) : 123456789

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

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

相关文章

PYQT 自带的 Pyrcc 系统的使用,PyInstaller对PYQT程序进行打包,不能打包背景图片,图标等解决办法

问题 使用 PyInstaller 对程序进行打包&#xff0c;不能打包背景图片。打包后的软件可以正常运行&#xff0c;但涉及到图片相关的资源全部不显示。 问题分析 当使用Python PyInstaller对程序进行打包时&#xff0c;如果程序中涉及到背景图片&#xff0c;会出现无法打包背景图…

第十一章 指针

第十一章 指针 目录一&#xff0e; 指针变量二&#xff0e; 取地址运算符和间接寻址运算符三&#xff0e; 指针赋值一&#xff0e; 指针变量 概述   指针就是地址&#xff0c;而指针变量就是存储地址的变量。指针的大小都是相同的。32位机器一个地址是4个byte。64位机器一个…

【ChatGPT】这是一篇ChatGPT写的关于Python的文章

文章目录Python基础语法教学1、变量2、数据类型3、运算符4、条件语句5、循环语句更高级的概念1、函数2、模块3、面向对象编程ChatGPT的记录Python基础语法教学 Python是一种高级编程语言&#xff0c;它被广泛应用于计算机科学领域、数据分析和人工智能等各种领域。在学习Pytho…

聊聊MyBatis缓存机制(一)

前言 Mybatis是常见的Java数据库访问层框架&#xff0c;虽然我们在日常的开发中一般都是使用Mybatis Plus&#xff0c;但是从官网信息可以知道&#xff0c;其实Mybatis Plus只是让开发者在使用上更简单&#xff0c;并没有改动核心原理。在日常工作中&#xff0c;大多数开发者都…

HTML5 <!DOCTYPE> 标签

实例 <!DOCTYPE> 声明非常重要&#xff0c;它是一种标准通用标记语言的文档类型声明&#xff0c;通过该标签&#xff0c;浏览器能够了解HTML5文档正在使用的HTML规范&#xff0c;<!DOCTYPE> 声明是HTML5文档的起始点&#xff0c;也就是说它必须位于HTML5文档的第一…

《SpringBoot》第03章 自动配置机制(二) 根注解@SpringBootApplication

前言 之前介绍到了把启动类封装成BeanDefinition注入进IOC容器&#xff0c;那么这个启动类就会跟普通的bean一样在refresh()中被实例化&#xff0c;那么显而易见作为启动类这个实例化并不简单&#xff0c;肯定会存在一些特殊处理&#xff0c;那么就需要研究一下其注解SpringBo…

AI只会淘汰不进步的程序员

最近AI界的大新闻有点多&#xff0c;属于多到每天很努力都追不上&#xff0c;每天都忙着体验各种新产品或申请试用新产品。各种自媒体肯定也不会放过这个机会&#xff0c;AI取代程序员的文章是年年有&#xff0c;今天特别多。那么AI到底会不会取代程序员的工作呢&#xff1f;先…

[chapter4][5G-NR][传输方案]

前言&#xff1a; 多天线传输的基本过程传输方案 前面见过数据加扰&#xff0c;调制&#xff0c;层映射的一些基本原理&#xff0c;算法。 这里重点讲一下传输方案 目录&#xff1a; 1&#xff1a; 下行传输方案 2&#xff1a; 上行传输方案 3&#xff1a; 资源块映射 备注&…

.net开发安卓从入门到放弃 最后的挣扎(排查程序闪退问题记录-到目前为止仍在继续)

安卓apk闪退问题排查记录logcat程序包名先看日志&#xff08;以下日志是多次闪退记录的系统日志&#xff0c;挑拣几次有代表性的发上来&#xff09;最近一次闪退adb shell tophelp一个demo说明adb shell dumpsys meminfo <package_name>ps&#xff1a;写在前面&#xff0…

训练中文版chatgpt

文章目录1. 斯坦福的模型——小而低廉&#xff1a;Alpaca: A Strong Open-Source Instruction-Following Model2. Meta 模型&#xff1a;LLaMA&#xff1a;open and efficient foundation language models3.ChatGLM4.斯坦福开源机器人小羊驼Vicuna&#xff0c;130亿参数匹敌90%…

SSM+LayUi实现的学籍管理系统(分为管理员、教师、学生三个角色,实现了专业管理,班级管理,学生管理,老师管理,课程管理,开课管理以及用户管理等)

博客目录jspservletmysql实现的停车场管理系统实现功能截图系统功能使用技术完整源码jspservletmysql实现的停车场管理系统 本系统是一个servlet原生框架实现的停车场管理系统&#xff0c;总共分为两个角色&#xff0c;普通用户和管理员&#xff0c;实现了用户管理、停车信息管…

Linux基础IO

本篇博客来讲述Linux中的新一模块--文件IO&#xff0c;我们来做简单的介绍和陈述。 在笔者之前的文章之中&#xff0c;已经对C语言中的文件操作做了简要介绍&#xff0c;我们旧事重提&#xff0c;再次进行一个简要的回顾。 目录 1.文件的操作 1.1打开文件 1.2向文件写入数…

Java多态

目录 1.多态是什么&#xff1f; 2.多态的条件 3.重写 3.1重写的概念 3.2重写的作用 3.3重写的规则 4.向上转型与向下转型 4.1向上转型 4.2向下转型 5.多态的优缺点 5.1 优点 5.2 缺点 面向对象程序三大特性&#xff1a;封装、继承、多态。 1.多态是什么&#xff1…

七结(4.2)遍历集合与javaFX界面

今天由学长学界们进行了一次授课&#xff0c;算是温习了一遍面向对象的知识&#xff0c;同时配置了关于javaFX的环境&#xff0c;以及一些关于项目的知识。 java学习总结&#xff1a; Collection的遍历&#xff1a; 迭代器遍历&#xff08;Iterator&#xff09;&#xff1a;…

leetcode 87. Scramble String(扰乱字符串)

scramble(字符串s) 算法&#xff1a; s长度为1时结束。 s可以拆分成2部分x和y&#xff0c;sxy, 这两部分可以交换&#xff0c;也可以不交换&#xff0c;即 s xy 或 s yx. 上面scramble还会递归作用于x 和 y. 给出相同长度的字符串s1, s2, 问s2是否可通过scramble(s1)获得。 …

WTW-16P 应用电路

1、WTW-16P 按键控制 PWM 输出应用电路 软件设置&#xff1a; 按键控制模式。 I/O 口定义&#xff1a; 选取 I/O 口 P00、P01、P02、P03 作为触发口&#xff0c;在编辑 WT588D 语音工程时&#xff0c;把触发口的按键定义为可触发播放的触发方式&#xff0c;就可进行工作。 BUS…

如何提高网站安全防护?

网站的安全问题一直是很多运维人员的心头大患&#xff0c;一个网站的安全性如果出现问题&#xff0c;那么后续的一系列潜在危害都会起到连锁反应。就好像网站被挂马&#xff0c;容易遭受恶意请求呀&#xff0c;数据泄露等等都会成为杀死网站的凶手。 1、让服务器有一个安全稳定…

百度双塔召回引擎MOBIUS

1. 概述 对于一个搜索或者推荐系统来说&#xff0c;分阶段的设计都是当下的一个标配&#xff0c;主要是为了平衡效率和效果&#xff0c;在百度的广告系统中&#xff0c;也是分成了如下的三层结构&#xff1a; 最上层的Matching阶段负责从全库中找到与query相关的候选集&#x…

KD2511N系列微电阻测试仪

一、产品概述 KD2511N系列微电阻测试仪是一款对变压器、电机、开关、继电器、接插件等各类直流电阻进行测试的仪器。其基本测试精度最高可达 0.05%&#xff0c;并具有较高的测量速度。 KD2511N微电阻测试仪使用了高精度恒流流经被测件以及四端测量&#xff0c;有效的消除了 引线…

Kafka 如何保证消息的消费顺序

文章目录先直接给出答案吧。在集群或者多partition下无法保障完全顺序消费&#xff0c;但是可以保障分区顺序消费。具体下面讲解。我们在使用消息队列的过程中经常有业务场景需要严格保证消息的消费顺序&#xff0c;比如我们同时发了 2 个消息&#xff0c;这 2 个消息对应的操作…