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与指针 的相关文章

随机推荐

  • 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