当前位置: 首页 > news >正文

45. C++ 字符指针和字符串

一、字符指针可以指向一个字符串。

我们可以用字符串常量对字符指针进行初始化。例如,有说明语句:

char *str = "This is a string.";

是对字符指针进行初始化。此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址。

这里要注意字符指针与字符数组之间的区别。例如,有说明语句:

char string[ ]="This is a string.";

此时,string是字符数组,它存放了一个字符串。

字符指针str与字符数组string的区别是:str是一个变量,可以改变str使它指向不同的字符串,但不能改变str所指的字符串常量。string是一个数组,每个元素的值都可以改变

例如下面的代码在运行期间将会出错:

 1 #include <iostream>2 using namespace std;3 int main(void)4 {5     char str1[] = "C Language";6     char *str2 = "C Language";7 cout << "str1=" << str1 << endl;8 cout << "str2=" << str2 << endl;9     str1[1] = '-';
10     str2[1] = '+';//出错!不能改变str所指的字符串常量// str2 = "C++ Language";可以改变str使它指向不同的字符串
11 cout << "str1=" << str1 << endl;
12 cout << "str2=" << str2 << endl;
13     return 0;
14 }

二、其它说明

  1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写:“abc”,那么编译器帮你存储的是"abc\0"

  2. "abc"是常量吗?答案是有时是,有时不是。

不是常量的情况:"abc"作为字符数组初始值的时候就不是,如:

char str[] = "abc";

因为定义的是一个字符数组,所以就相当于定义了一些空间来存放"abc",而又因为字符数组就是把字符一个一个地存放的,所以编译器把这个语句解析为

char str[3] = {'a','b','c'};

又根据上面的总结1),所以

char str[] = "abc";

的最终结果是

 char str[4] = {'a','b','c','\0'};

做一下扩展:如果

char str[] = "abc";

是在函数内部写的话,那么这里的"abc\0"因为不是常量,所以应该被放在栈上。

是常量的情况:把"abc"赋给一个字符指针变量时,如

char* ptr="abc";

因为定义的是一个普通指针,并没有定义空间来存放"abc",所以编译器得帮我们找地方来存放"abc",显然,把这里的"abc"当成常量并把其放到程序的常量区是编译器最合适的选择。所以尽管ptr的类型不是const char*,并且ptr[0]='x’也能编译通过,但是执行ptr[0]='x’就会发生运行时异常,因为这个语句试图去修改程序常量区中的东西。

记得哪本书中曾经说过char* ptr = “abc”;这种写法原来在C++标准中是不允许的,但是因为这种写法在C中实在是太多了,为了兼容C,不允许也得允许。虽然允许,

但是建议的写法应该是**const char* ptr = “abc”;这样如果后面写**ptr[0] = 'x’的话编译器就不会让它编译通过,也就避免了上面说的运行时异常。

又扩展一下:如果char* ptr = “abc”;写在函数体内,那么虽然这里的"abc\0"被放在常量区中,但是ptr本身只是一个普通的指针变量,所以ptr是被放在栈上的, 只不过是它所指向的东西被放在常量区罢了。

  1. 数组的类型是由该数组所存放的东西的类型以及数组本身的大小决定的。如char s1[3]和char s2[4],s1的类型就是char[3],s2的类型就是char[4],也就是说尽管s1和s2都是字符数组,但两者的类型却是不同的。

  2. 字符串常量的类型可以理解为相应字符常量数组的类型,如"abcdef"的类型就可以看成是const char[7]

  3. sizeof是用来求类型的字节数的。如int a;那么无论是sizeof(int)或者sizeof(a)都是等于4,因为sizeof(a)其实就是sizeof(type of a)

  4. 对于函数参数列表中的以数组类型书写的形式参数,编译器把其解释为普通的指针类型,如对于

void func(char sa[100],int ia[20],char *p)

则sa的类型为char*,ia的类型为int*,p的类型为char*

  1. 根据上面的总结,来实战一下:
  • 对于char str[] = "abcdef";就有sizeof(str) == 7,因为str的类型是char[7],
  • 也有sizeof("abcdef") == 7,因为"abcdef"的类型是const char[7]
  • 对于char *ptr = "abcdef";就有sizeof(ptr) == 4,因为ptr的类型是char*。
  • 对于char str2[10] = "abcdef";就有sizeof(str2) == 10,因为str2的类型是char[10]。
  • 对于void func(char sa[100],int ia[20],char *p);
  • 就有sizeof(sa) == sizeof(ia) == sizeof§ == 4,
  • 因为sa的类型是char*,ia的类型是int*,p的类型是char*。

三、区别

(1)字符数组由若干个元素组成,每个元素中存放字符串的一个字符,而字符指针变量中存放的是字符串的首地址。

(2)初始化方式不同。对字符数组初始化要用static存储类别,在编译时进行。而对字符指针变量初始化不必在static,在实际执行时进行。

(3)赋值方式不同。对字符数组不能整体赋值,只能转化成份量,对单个元素进行。而字符指针变量赋值可整体进行。

例如:

1 char s[10];
2 s= \"C++\";/*对字符数组不能整体赋值*/

(4)在定义一个字符数组时,编译时即已分配内存单元,有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,但该指针变量具体指向哪个字符串,并不知道,即指针变量存放的地址不确定。例如:

1 char a[10];
2 char *p;
3 scanf(\"%s\",a);/*正确*/
4 scanf(\"%s\",p);/*非常危险,p的值动态*/

(5)字符指针变量的值可以改变,字符数组名是一个常量,不能改变。例如,有简单程序:

1 main()
2 {
3     char *s=\"china man\"
4     s+=6;
5     printf(\"%s\",s);
6 }
7 
8 //运行结果:man

相关文章:

45. C++ 字符指针和字符串

一、字符指针可以指向一个字符串。 我们可以用字符串常量对字符指针进行初始化。例如&#xff0c;有说明语句&#xff1a; char *str "This is a string.";是对字符指针进行初始化。此时&#xff0c;字符指针指向的是一个字符串常量的首地址&#xff0c;即指向字符…...

如何制作一款3D FPS游戏

制作一款3D FPS游戏是一个复杂的过程&#xff0c;需要涵盖多个方面&#xff0c;包括游戏设计、游戏引擎选择、模型制作、音效制作、关卡设计等。下面是一个关于如何制作一款3D FPS游戏的超长文章。 游戏设计 首先&#xff0c;你需要确定游戏的整体设计和核心玩法。这包括游戏的…...

人工智能|深度学习——使用多层级注意力机制和keras实现问题分类

代码下载 使用多层级注意力机制和keras实现问题分类资源-CSDN文库 1 准备工作 1.1 什么是词向量? ”词向量”&#xff08;词嵌入&#xff09;是将一类将词的语义映射到向量空间中去的自然语言处理技术。即将一个词用特定的向量来表示&#xff0c;向量之间的距离&#xff08;例…...

C语言常见面试题:C语言中如何进行网页开发编程?

在C语言中进行网页开发通常不是一个直接的过程&#xff0c;因为C语言主要用于系统级编程&#xff0c;而不是Web开发。传统的Web开发主要使用高级语言如JavaScript、Python、Ruby、PHP等&#xff0c;以及与Web相关的技术&#xff0c;如HTML、CSS和数据库。 然而&#xff0c;如果…...

DevOps落地笔记-20|软件质量:决定系统成功的关键

上一课时介绍通过提高工程效率来提高价值交付效率&#xff0c;从而提高企业对市场的响应速度。在提高响应速度的同时&#xff0c;也不能降低软件的质量&#xff0c;这就是所谓的“保质保量”。具备高质量软件&#xff0c;高效率的企业走得更快更远。相反&#xff0c;低劣的软件…...

政安晨:梯度与导数~示例演绎《机器学习·神经网络》的高阶理解

这篇文章确实需要一定的数学基础&#xff0c;第一次接触的小伙伴可以先看一下我示例演绎这个主题的前两篇文章&#xff1a; 示例演绎机器学习中&#xff08;深度学习&#xff09;神经网络的数学基础——快速理解核心概念&#xff08;一&#xff09;&#xff1a; 政安晨&#…...

CTFSHOW命令执行web入门29-54

description: >- 这里就记录一下ctfshow的刷题记录是web入门的命令执行专题里面的题目,他是有分类,并且覆盖也很广泛,所以就通过刷这个来,不过里面有一些脚本的题目发现我自己根本不会笑死。 如果还不怎么知道写题的话,可以去看我的gitbook,当然csdn我也转载了我自己的…...

探索ChatGPT4:新一代人工智能语言模型的突破

ChatGPT4&#xff0c;作为最新一代的语言处理模型&#xff0c;代表了人工智能在自然语言理解和生成方面的最新突破。本文将深入介绍ChatGPT4的新特性&#xff0c;探讨其在各个领域的潜在应用。 ChatGPT4概述 在继承了前一代模型的强大基础之上&#xff0c;ChatGPT4引入了多项…...

PVST详解

PVST&#xff08;Per-VLAN Spanning Tree&#xff09;是Cisco公司的一种扩展的Spanning Tree协议&#xff0c;允许在每个VLAN中独立运行一个Spanning Tree实例&#xff0c;从而提高网络的可靠性和性能。 PVST协议在每个交换机中维护多个Spanning Tree实例&#xff0c;每个实例…...

c++ 子进程交互 逻辑

目录 一、主进程逻辑 1、创建子进程时候,写入自己的HWND 2、响应子进程消息...

C#实现矩阵乘法

目录 一、使用的方法 1.矩阵 2.矩阵的乘法原理 二、实例 1.源码 2.生成效果 一、使用的方法 矩阵相当于一个数组&#xff0c;主要用来存储一系列数&#xff0c;例如&#xff0c;mn矩阵是排列在m行和n列中的一系列数&#xff0c;mn矩阵可与一个np矩阵相乘&#xff0c;结果…...

Objective-C 中的SEL

在 Objective-C 中&#xff0c;SEL&#xff08;Selector&#xff09;是一种用来表示方法的类型。 它实际上是一个指向方法的指针&#xff0c;用于在运行时动态调用方法。 下面是一个使用 SEL 的代码示例&#xff1a; #import <Foundation/Foundation.h>interface MyCl…...

使用 Docker 镜像预热提升容器启动效率详解

概要 在容器化部署中,Docker 镜像的加载速度直接影响到服务的启动时间和扩展效率。本文将深入探讨 Docker 镜像预热的概念、必要性以及实现方法。通过详细的操作示例和实践建议,读者将了解如何有效地实现镜像预热,以加快容器启动速度,提高服务的响应能力。 Docker 镜像预热…...

锁(二)队列同步器AQS

一、队列同步器AQS 1、定义 用来构建锁或者其他同步组件的基础框架&#xff0c;它使用了一个int成员变量表示同步状态&#xff0c;通过内置的FIFO队列来完成资源获取线程的排队工作。是实现锁的关键。 2、实现 同步器的设计是基于模板方法模式的&#xff0c;也就是说&#…...

【知识整理】招人理念、组织结构、招聘

1、个人思考 几个方面&#xff1a; 新人&#xff1a;选、育、用、留 老人&#xff1a;如何甄别&#xff1f; 团队怎么演进&#xff1f; 有没有什么注意事项 怎么做招聘&#xff1f; 2、 他人考虑 重点&#xff1a; 1、从零开始&#xff0c;讲一个搭建团队的流程 2、标…...

监控概述、安装zabbix、配置zabbixagent、添加被控端主机、常用监控指标、自定义监控项

目录 监控概述 监控命令 zabbix 安装zabbix 6.0 配置zabbix监控web1服务器 在web1上安装agent 在web页面中添加对web1的监控 常用监控指标 自定义监控项 实现监控web1用户数量的监控项 在被控端创建key 创建模板 应用模板到主机 查看结果 监控概述 对服务的管理&am…...

恒创科技:香港 BGP 服务器网络连通性如何测试?

随着互联网的快速发展&#xff0c;网络连通性测试变得越来越重要。网络连通性测试的目的是确定网络设备之间的连接是否正常&#xff0c;以及数据包是否能够在网络中顺利传输。本文将介绍一种简单易行的香港 BGP 服务器网络连通性的测试方法&#xff0c;利用tracer测试工具。这里…...

《动手学深度学习(PyTorch版)》笔记7.6

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…...

Quicker读取浏览器的书签(包括firefox火狐)

从edge换了火狐&#xff0c;但是quicker不能读取本地的bookmarks文件了&#xff0c;就研究了一下。 方法1&#xff1a;读取本地Bookmarks文件&#xff08;仅谷歌内核浏览器&#xff09; 谷歌内核的浏览器本地会有Bookmarks文件&#xff0c;放了所有的书签数据&#xff0c;直接…...

【数学建模】【2024年】【第40届】【MCM/ICM】【B题 搜寻潜水器】【解题思路】

一、题目 &#xff08;一&#xff09;赛题原文 2024 MCM Problem A: Resource Availability and Sex Ratios Maritime Cruises Mini-Submarines (MCMS), a company based in Greece, builds submersibles capable of carrying humans to the deepest parts of the ocean. A …...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...