C++ 指针(二)char与指针

2023-05-16

一、char字符串数组和char指针

上一小节对指针的操作进行简单的介绍,本小节主要介绍的是char类型和指针之间的一些联系。(虽然使用std::string很方便,但是我觉得了解这个还是有必要的)

我们都知道,在C语言中,储存字符串使用的是char类型数组或者char类型的指针,这当然在C++中也适用,如下所示:

char arr[20] = "Hello world!";
char* p = "Hello world!";

这里其实就可以产生一个疑问。使用char数组来储存字符串还挺好理解,就是将字符一个一个放入数组中,但是使用指针来储存是怎么进行储存的,指针p指向的地址是哪?

为了解决上述的问题,我们使用cout将上述两者输出:

cout << arr << endl;
cout << p << endl;

//输出
//Hello world!
//Hello world!

上面两者的运行结果一致!那么答案显而易见了。arr是字符数组的第一个字符的地址,那么p其实也是指向的是字符串第一个字符的地址。

为了验证所想,我们将数组第一个元素的地址赋值给指针,然后分别打印字符串和地址。我们将其输出:

p = arr;
cout << arr << endl;
cout << p << endl;
cout << (int *)arr << endl;
cout << (int *)p << endl;

//输出:
//Hello world!
//Hello world!
//0xa9a1dff96b
//0xa9a1dff96b

其实通过上述的例子我们还可以知道的一个信息是 "Hello world!" 这个东西所返回的其实也是该字符串第一个字符的地址。

这里需要注意的是,C++大多数的表达式中,char类型数组名、char类型指针、用引号括起的字符串常量通常都被解释为字符串的第一个地址。

二、使用new开辟空间拷贝字符串

上面介绍了char类型数组名、char类型指针、用引号括起的字符串常量之间的关系,下面简单介绍一下如何使用new开辟空间拷贝字符串,这里不能使用简单的赋值运算符。

之前已经介绍过new的基本用法,这里不多赘述,直接上代码:

char arr[20] = "computers";
char* p = new char[strlen(arr) + 1];
strcpy(p, arr);

上述代码中我们创建了一个字符串数组来储存一个字符串,然后使用new开辟了一块strlen(arr)+1大小的空间,最后使用strcpy()来拷贝字符串。此时,p和arr的地址不同,但内容相同。

为什么空间大小是strlen(arr)+1?

因为每个字符串后面需要有一个空字符,从而才能知道当前字符串在哪停止。

此外,当你对将某个字符串拷贝一个固定长度的数组时,还可能会遇见字符串长度超过数组长度,这时,如果继续使用strcpy()进行拷贝,就会覆盖掉数组空间后的一段内存空间。该内存空间可能是有用的。所以,我们就不能使用strcpy(),而是使用strncpy()。代码示例:

strncpy(arr, "Hello world, Hello world, Hello world, Hello world, Hello world...", 19);
arr[19] = '\0';

strncpy()的第三个参数指的是要复制的字符数量。代码第二行指的是将数组的最后一个元素置为空。因为strncpy在数组空间用完之后不会自动添加空字符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 指针(二)char与指针 的相关文章

  • С++ 中的字符串文字是在静态内存中创建的吗?

    C 中的字符串文字是否在静态内存中创建并仅在程序退出时销毁 是的 字符串文字在程序的整个持续时间内都有效 即使在静态对象销毁期间也是如此 标准中的2 13 4 1说 普通字符串文字具有 n const char 数组 类型和静态存储持续时间
  • "" 和 " " 之间有什么区别,如何根据字符测试前者?

    在Java中 空引号 和 带有单个空格的引号 之间有什么区别以及如何测试前者char 代表空字符串 is not空 它包含一个空格字符 你不能用以下方式来测试前者char 因为没有字符 用 a 来测试它String 它是String长度为零
  • C 删除文件最后 n 个字符

    我需要使用 C 代码从文件中删除最后 n 个字符 起初我尝试使用 b 但它返回了分段错误 我看到类似问题的有趣答案here https stackoverflow com questions 584639 truncate file and
  • 如何检查一个字符是否等于一个空格?

    这是我所得到的 private static int countNumChars String s for char c s toCharArray if Equals c 但该代码表示 找不到该方法的符号 我记得 Java 有一个这样的比
  • Oracle JDBC 和 Oracle CHAR 数据类型

    我在 Oracle JDBC 驱动程序的处理方面遇到了一个棘手的问题CHAR数据类型 让我们看一下这个简单的表格 create table x c char 4 insert into x c values a inserts a 所以当我
  • 将 C dll 代码编组为 C#

    我在 dll 中有以下 C 代码签名 extern declspec dllexport unsigned char funct name int w int h char enc int len unsigned char text in
  • 使用 int 值初始化向量

    我想用这个 ASCII 代码初始化这个 char 向量 vector
  • 如何获取字符串的前五个字符

    我读过这个获取第一个字符的问题 https stackoverflow com q 3878820 1716774字符串的 有没有办法从 C 中的字符串中获取前 n 个字符 您可以使用可枚举 Take http msdn microsoft
  • 实现 `memcpy()`:需要 `unsigned char *`,还是只需要 `char *`?

    我正在实施一个版本memcpy 能够与它一起使用volatile 使用安全吗char 或者我需要unsigned char volatile void memcpy v volatile void dest const volatile v
  • 非法转义字符“\”

    我想在链接末尾获取名称 所以我这样做了 if invName substring j k equals copyf invName substring 0 j Eclipse 说字符串文字没有用双引号正确关闭 如何将字符串与此字符进行比较
  • 为什么C++变量是指针时不需要正确定义?

    我对 C 语言完全陌生 特别是指针 经验主要是 PHP 并且希望对以下内容进行一些解释 我已经尝试寻找答案 这两行代码如何能够在我的程序中完成完全相同的工作 第二行似乎违背了我迄今为止所学到和理解的关于指针的一切 char disk 3 D
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 为什么 dotnet 的 char.IsLower() 是静态方法?

    这似乎违背了每一个设计准则 接受 T 类型的单个参数的静态方法通常应该只是一个成员方法 这太奇怪了我实际上不得不发布一个StackOverflow问题 https stackoverflow com questions 389100 is
  • 正则表达式可以与 C++ 中的字符数组一起使用吗

    我正在开发一个无法使用字符串库文件的程序 而是使用字符数组 我能够使用正则表达式 并且想知道是否有办法使用正则表达式和字符数组 甚至正则表达式和单个字符 我问的原因是当我尝试在匹配中使用我的 char 数组时 xUtility 会抛出一堆来
  • 如果存储字符串的 char 数组小于字符串,C++ 真正将字符串存储在哪里?

    我正在测试 C Premiere 书中有关 C 字符串的示例 const int size 9 char name1 size char name2 size C owboy 8 characters here cout lt lt How
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include
  • 将字符串转换为字符并按降序排序(ascii)

    我正在创建一个程序 该程序将使用户输入整数 一个接一个 存储在数组中并按降序显示整数 该程序还要求用户输入一个字符串 使用以下命令将其转换为字符string toCharArray 我已经正确地按降序显示整数 问题是我不知道如何按降序显示字
  • 将 System.Windows.Forms.Keys 序列转换为 Char

    有没有办法转换由 Keys 枚举表示的击键序列 即System Windows Forms Keys 在一个字符中 例如 Keys Oem4进而Keys A产生 char 它一定存在于 WinAPI 中的某个地方 因为当我在文本框中按下按键
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何使用 Java 本机接口将字节数组传递到以 char* 作为参数的 C 函数中?

    所以我需要使用JNI从java调用C函数 当传入不同的数据类型 创建本机变量 头文件 共享库等等 时 我已经能够成功地做到这一点 但无法让它与字节数组一起使用 这是我的 C 函数 include

随机推荐

  • python 用 xlwings 处理 Excel 中的重复数据

    xlwings 简介 xlwings 是一个 Python 库 简化了 Python 和 Excel 通信 xlwings 让Excel跑得飞快 本文写作背景 amp 需求 amp 方案 因前几个月帮在医院工作的朋友现学现卖用VBA写了段程
  • STM32学习(5)外部中断实验

    STM32 的每个 IO 都可以作为外部中断的中断输入口 xff0c 这点也是 STM32 的强大之处 STM32F103 的中断控制器支持 19 个外部中断 事件请求 每个中断设有状态位 xff0c 每个中断 事件都有独立的触发和屏蔽设置
  • STM32学习(6) 定时器中断实验

    基本定时器功能简介 1 计数器16bit xff0c 只能向上计数 xff0c 只有TIM6和TIM7 2 没有外部的GPIO xff0c 是内部资源 xff0c 只能用来定时 3 时钟来自PCLK1 xff0c 为72M xff0c 可实
  • STM32学习(7)PWM 输出实验

    脉冲宽度调制 PWM xff0c 是英文 Pulse Width Modulation 的缩写 xff0c 简称脉宽调制 xff0c 是利用 微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术 简单一点 xff0c 就是对脉冲宽度的
  • STM32中NVIC_SystemReset()函数的作用?什么时候用?

    STM32软件复位有两种方式 xff08 1 xff09 方式一 xff1a NVIC SystemReset 函数用来复位STM32 注意1 xff1a 从SYSRESETREQ 被置为有效 xff0c 到复位发生器执行复位命令 xff0
  • 一秒钟打印一个100S内的随机数

    1 2 gt Des 一秒钟打印一个100S内的随机数 5 gt Created Time 2021年04月19日 星期一 09时35分27秒 6 7 8 include lt stdio h gt 9 include lt stdlib
  • STM32启动文件学习

    2021 08 09 STM32启动文件学习 启动文件作用 xff1a 初始化堆栈指针SP初始化PC指针初始化中断向量表配置系统时钟调用C库 main函数进入到主程序 启动文件使用的ARM汇编指令 xff1a EQU xff1a 等于 AR
  • 03-串口(UART)的使用

    目录 第一节 UART概述1 1 UART的用处 xff1a 1 2 UART的优点1 3 UART原理与概念1 4 UART数据传输原理与过程1 5 关于电平转换1 6 UART内部具体机制 第二节 UART编程 第一节 UART概述 1
  • python基础知识之开发规范(一)

    1 脚本结构 1 1 头注释 对代码没有用 xff0c 是提供给系统或者解释器使用的 usr bin env 定义 指定路径下的Python解释器 xff0c 已经很少使用 1 2 导入 导入Python的一些功能函数到脚本中 Python
  • vivo真机调试的坑 & adb无线调试

    坑1 xff1a 安装失败 解决方案 xff1a 在工程的gradle properties中加上 android injected testOnly 61 false 坑2 xff1a 总是要输入密码才能安装 解决方案 xff1a 1 开
  • JavaScript --Node,js

    引用系统模块 const http 61 require http 创建 web 服务器 const serve 61 http createServer 当客户端 发送请求的时候 server on require req res 61
  • Cmake 2 静态链接

    代码地址cmake examples 01 basic C static library at master ttroy50 cmake examples GitHub 文件路径这样 cmake文件这样 1 生成静态链接库 2 填充包括目录
  • Cmake 3 动态链接库

    代码地址 cmake examples 01 basic D shared library at master ttroy50 cmake examples GitHub 文件结构 1 添加动态链接库 和静态链接一样 这个add libra
  • PelcoD_协议指令分析

    通过协议收发控制第三方云台转动 一般的云台指令协议格式例如 xff1a span class token comment 发送带正负号的垂直角度 span span class token keyword float span vert a
  • 【学习笔记】Esp32 Arduino 串口中断函数 缓冲区修改

    Esp32 Arduino 串口中断函数 缓冲区修改 一 前景描述1 遇到的问题2 开发环境 二 解决问题1 示例代码2 代码缺陷2 解决办法 三 最后的话 一 前景描述 最近需要用Esp32上传数据 xff0c 有一块数据采集板 xff0
  • C++程序编译过程

    C 43 43 程序编译的四个步骤 xff1a 编译预处理 xff0c 编译优化 xff0c 汇编 xff0c 链接 编译预处理 xff1a 处理以 开头的指令 xff0c 将源码 cpp 文件处理成 i 文件 编译优化 xff1a 将 i
  • 查询方式/中断方式/DMA方式的区别及适用范围

    区别 xff1a 查询方式 xff1a CPU与设备串行工作 数据传送与主程序串行工作 xff1b 中断方式 xff1a CPU与设备并行工作 数据传送与主程序串行工作 xff1b DMA方式 xff1a CPU与设备并行工作 数据传送与主
  • vscode、idea、vim 开发工具快捷键

    vscode vscode快捷键文字版 配置启用 禁用 VSCodeVim 插件的快捷键 xff1a Vim Toggle Vim Mode 项 配置启用 vimrc 文件 idea 配置启用 禁用 Idea Vim 插件的快捷键 xff1
  • TDK一体化 IMU 评估板SmartBug2.0 像七星瓢虫一样可爱

    继 2019 年最初的 SmartBug 取得成功后 xff0c 2023 年 1 月初 xff0c TDK 公司宣布宣布推出 InvenSense SmartBug 2 0 评估板 SmartBug2 0 外观与 SmartBug 相似
  • C++ 指针(二)char与指针

    一 char字符串数组和char指针 上一小节对指针的操作进行简单的介绍 xff0c 本小节主要介绍的是char类型和指针之间的一些联系 xff08 虽然使用std string很方便 xff0c 但是我觉得了解这个还是有必要的 xff09