C++字符指针的特殊

2023-11-05

 如果我们对一个非字符的指针进行操作,方法是这样的: 
注意:int* p;则p[i]等价于*(p+i)


  定义: 
    (1)int a=7; int *p=&a; 或者 
    (2)int a=7; int *p; p=&a; 或者 
    (3)int a=7; int *p; *p=a; 

  (1)这样定义的原因是因为等号两边的类型必须匹配,int *p=&a; 等号左边定义的是一个指针,指针的内容是地址,所以等号右边也应该是地址,&a就是取空间a的地址; 
    (2)int *p; p=&a; 为什么不是 *p=&a 而是 p=&a; 因为在定义的时候“*”只是说明p是一个指针,而p也是一个变量,不过是储存地址的一种特殊的变量,对于变量使用,我们都是直接使用它的名字,就好象,我们定义个常量 const a=7; 我们要调用它的时候直接使用a就可以了,并不需要带上 const 修饰,这里也一样,用指针变量时并不需要带上“*”; 
    (3)而第三种情况中的 *p=a;中的“*”和第二种里面是不同的,这里的“*”是取内容符,与之相反的是取地址符“&”,分析一下,第三种情况中,等号左边是*p表示对指针p取内容,它的内容指向内存中的某个已经在开始通过 int *p; 定义好的空间里(比较确切一点的说法是,p在定义的时候,其内容里的地址指向内存中某个未知的空白区域,即未占用,不受保护的内存空间),这个空间里存放的数据类型是整型,所以等号的右边也应该是整型才能匹配,所以是 *p=a; 这里的“*”和定义时候的是不同的,这一点很重要。 

  其实上面的都是些题外话,我要说的其实是关于指针的输出的一些问题。我们利用上面定义好的进行输出操作。 

  输出指针的内容(即所指向空间的地址):cout<<p<<endl; 
  输出指针所指的内容(即指针内容所描述地址空间中的内容):cout<<*p<<endl; 

  指针对于字符的处理却有些特殊,和前面的非字符的指针输出处理要分开理解。 

  比如,我们定义一个 char a='A'; char *p=&a;  如果我们调用上面非字符指针的输出方式,结果如下: 
  方式1 cout<<p<<endl; 结果 A####(#表示乱码,不可识别) 并不是地址 
  方式2 cout<<*p<<endl; 结果 A 这和非字符的指针情况一样,输出指针指向的内容 
  而且我们直接操作 cout<<&a<<endl; 结果和方式1的结果是完全相同的 

  为什么方式1输出的不是地址呢?这里有一个特殊的处理,虽然这里的p的内容确确实实是一个地址,但是cout操作字符指针的话,它遇到地址,就会直接去寻找这个地址所指向的内容,并把它的空间里的机器数按照字符的规则转化成字符输出,直到遇到“\0”这个操作符才停止。所以我们直接输出p的时候,它先输出‘A’然后再继续读取后面的内存空间知道遇到“\0”,显示结果是“A+乱码”。 

  你肯定会说,为什么要这样呢,这样多不方便呀,其实这么做是有目的的,而且恰恰就是为了方便才这么设置的。因为这样就可以很容易的处理字符串了,而处理字符串是我们在计算机中用得很多的操作。 

  比如我们第一个字符串数组 char a[]="mantou"; a[]在内存中在7个字节,而不是6个,因为在mantou字符串后面还隐藏有一个“\0”,这时我们用 char *p=a; (这里不用&a是因为,a[]是一个数组,数组名a本身就是一个指针常量) 输出操作 cout<<p<<endl; 这里就不会输出地址,而是直接输出整个mantou字符串,很方便哈,如果我们 cout<<*p<<endl; 结果显示的是m,因为p是指向数组的首元素的地址的,就是指向这里的储存m的空间的地址,所以取p的内容(*p),只能输出一个m哦。 

  虽然通常情况下我们是不需要了解我们的数据地址的,但我也顺便说说,怎么得到字符指针的地址,也可以方便大家对内存地址的分配再做更深入的研究。 

  char a='A';  如果这里直接输出 cout<<&a<<endl; 当然是不能输出地址的,原理上面已经说过了,cout遇到字符型地址就会转换成字符串输出。我们可以用指针p先取得a的地址(char *p=&a;),但是这样用 cout<<p<<endl;也并不能得到地址呀,原因上面也说过了。 
    做个小技巧,首先我们知道p中的内容本身就是地址,但是因为它是字符串,我们又不能直接输出它,所以呀,我们可以把指针里的内容(记载的是一个地址数据)强制转化成整型再输出 cout<<(int)p<<endl; 呵呵,这样就得到了这个指针里的内容——十进制型的地址,而我们知道,地址是用十六进制表示的,形式是 0x######## 0x后面加8位十六进制数,我们把我们先得到的十进制地址按照地址的表示形式用流操作转化成十六进制就可以了。代码如下: 
cout<<endl<<"0x" 
     <<setw(8)<<setiosflags(ios::right)<<setfill('0') 
     <<setiosflags(ios::uppercase)<<hex<<(int)p<<endl; 

注意不要忘了 #include<iomanip.h> 这个头文件哦  

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

C++字符指针的特殊 的相关文章

  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 龙书笔记(12)

    chap 12 设计一个灵活的Camera类 主要是创建一个相机类 Camera 1 Camera类的设计 右向量 right vector 上向量 up vector 观察向量 look vector 位置向量 position vect
  • Linux高性能网络编程:TCP底层的收发过程

    今天探索高性能网络编程 但是我觉得在谈系统API之前可以先讲一些Linux底层的收发包过程 如下这是一个简单的socket编程代码 int main fd socket AF INET SOCKET STREAM 0 bind fd lis
  • Linux如何(永久)关闭SElinux和firewalld防火墙

    本文基于Linux上CentOS 7版本进行演示 目录 一 关闭SElinux 1 临时关闭 2 永久关闭 二 关闭防火墙 firewalld服务 1 查看防火墙状态 2 关闭防火墙 一 关闭SElinux 1 临时关闭 使用setenfo
  • CAN接受和发送失败的原因有哪些---之前调试MCP2515驱动时,数据一直发不出去,三个发送邮箱都被占满.至今未解决,读寄存器-总线错误

    0 CAN总线错误分析与解决 讲的最精辟的放在最前面 我们知道CAN总线上的每个节点往总线上发送数据的同时会同时读取总线上的数据 并与自己发送的数据作对比 CAN仲裁 CAN总线错误分别有发送和接收错误计数 计数达到一定的累计以后就会产生C
  • InnoDB存储引擎 3文件

    参数 查看information schema下的GLOBAL VARIABLES查找参数 但是在mysql8 0 21没有这张表格 视图 出错 SELECT FROM global variables WHERE VARIABLE NAM
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • count(1)、count(*)与count(列名)的执行区别

    执行效果 1 count 1 and count 当表的数据量大些时 对表作分析之后 使用count 1 还要比使用count 用时多了 从执行计划来看 count 1 和count 的效果是一样的 但是在表做过分析之后 count 1 会
  • Python计算水仙花数

    水仙花数是指一个 3 位数 它的每个位上的数字的 3次幂之和等于它本身 例如 1 3 5 3 3 3 153 方法1 用 for循环 控制1000以内的3位数 依次求出该3位数中的个十百位 判断是否是水仙花数 方法2 x y z分别表示一个
  • 如何创建并发布你的angular组件库

    本例创建一个天气组件 ng new weatherwidget createApplication false 选择不要路由 选择scss cd weatherwidget 用vs code打开本项目 创建组件库weather ng gen
  • 给学习C语言的朋友推荐一本好书!

    友情提示 本图书链接指向第二书店的图书详细页面 近期公司要开展技术学习及培训 推荐使用了两本教材 一本是清华大学出版社的 计算机科学概念 第8版 人民邮电出版社出版了该书的第7版 另一本则是电子工业社出版的Programming in C
  • drools规则引擎的在项目中的使用手记

    需求 按照登录用户的会员等级 和签到周期 根据一定的计算规则送积分 由于之前都是通过if else去做的控制 规则变更的时候可能需要重新调整代码甚至发布服务 由于不想再每次规则变更后需要调整代码 于是最近在确认方案 于是最好找到了规则引擎
  • python3 条件语句

    条件语句 if 判断条件 执行语句 else 执行语句 if 判断条件1 执行语句1 elif 判断条件2 执行语句2 elif 判断条件3 执行语句3 else 执行语句4 python 并不支持 switch 语句 如果多个条件需同时判
  • uniapp打包app,对接华为厂商,实现unipush离线消息推送

    今天终于可以抽出点时间 来记录一下这几天心塞的心情 上周公司派过来一个活 说是使用uniapp制作一个app 同时要实现在线消息推送和离线消息推送 啥话没说就揽了下来 不过说实在的 从来没有开发过app 好歹会点vue 可想而知 接下来的几
  • arduino基础25个实验代码

    arduino基础25个实验代码 双色LED灯项目源码 int redPin 11 红色LED引脚 int greenPin 10 绿色LED引脚 int val 0 PWM输出值 void setup pinMode redPin OUT
  • 华为打造狼性团队的22条军规

    打造狼性团队的22条军规 领导者要读3遍 打出来 贴到桌子上 做老板的 无不对华为公司的狼性团队推崇有加 华为的狼性文化之所以如此成功 三大因素缺一不可 一是具有诱惑力的薪酬 这是自驱力 二是内部竞争机制 这是推动力 三是执行力文化 这是牵
  • 类的静态成员变量为什么不能再h文件类外初始化

    h文件 class Image public static void AddProtoType Image iamge Prototype nsize iamge private static Image Prototype 10 stat
  • pandas练习题

    按要求创建Dataframe df 并通过分组得到以下结果 以A分组 求出C D的分组平均值 以A B分组 求出D E的分组求和 以A分组 得到所有分组 以字典显示 按照数值类型分组 求和 将C D作为一组分出来 并计算求和 以B分组 求出
  • git撤销一次代码提交方法

    以下方法亲测有效 但是根据需求选择哦 友情提示 注意备份 方法一 1 删除上一次提交 或者撤销上一次合并 reset方式是将HEAD指针指到指定提交 历史记录则不会出现你删除的上步commit记录等 合并时间线等都会删除彻底 并删除 mer
  • 分享是个好习惯

    无止境的求索 把脚印记下来 累了 迷茫了 回头望望 记住来时的路 收拾收拾行囊 云淡风轻
  • C++字符指针的特殊

    如果我们对一个非字符的指针进行操作 方法是这样的 注意 int p 则p i 等价于 p i 定义 1 int a 7 int p a 或者 2 int a 7 int p p a 或者 3 int a 7 int p p a 1 这样定义