c++中的printf、和cout和cin后面跟指针的问题
printf里面打印指针的问题
而在c语言中,使用printf只需要使用不同的格式就可以区分打印出是字符串还是指针变量的值:

cout和cin后面跟指针的问题
cout<<mm 和cin>>nn;它是可以自己识别mm和nn是不是指针变量吗?
答:cin后面只能跟char*的指针,别的类型指针(eg:int*)报错; (这里只是说cin后面跟的指针类型的限制,不涉及其它类型)
cout后面跟char*的指针,打印的是里面的内容,cout后面跟int*的指针,打印的是地址;
cin输入时,如果给char* 会自动结束符吗,会的;
char *p2;前提是p2指向有空间的地址
cin >> * p2 ; //只是输入一个字符
cin >> p2 ; //输入p2所指的空间内容 全部修改
在C语言里,输出一个字符串的指针很方便,直接printf("%p/n",p);就输出了。
而 C++ 里 cout 太自作聪明了,为了省去我们循环输出字符的麻烦, cout<<p<<endl; 被翻译为输出 p 指向的字符串值。
这个时候要输出 p 的指针值就只能先将其转为 void * 再输出。因为 void 型, cout 没法输出,只能乖乖输出指针。
此外 cout<<&p<<endl; 是不可取的,它其实等效于 printf("%p/n",&p);
那个输出流运算符被重载过,这样更加方便输出字符串,因为字符串比较特殊,用/0结尾,
所以这样的重载可行,输出到内存为 /0 的地方就可以,但是普通数组没有这样的特性所以不重载,直接输出地址
举例说明
我们知道在c++中指针变量和指针所指向的内存是两个完全不同的概念,指针变量里边存放的是一个地址,那么我们怎么输出指针变量的值,以及怎么输入指针变量本身的地址呢?
char *p="abcde";
cout << hex << &p <<endl;//此处是输入指针变量的地址
cout << hex << (void *)p<<endl;//此处是输出指针变量的值 即指针所指向内存的地址
(void *)强制类型转换
因此,同样的,对于怎么访问类对象中指针变量的值和类对象中指针变量的地址:
class name
{
public:
name(char *pn); ~name();
//protected:
char *pname; int size;
}; name::name(char *pn)
{
cout << " Constructing " << pn << endl;
pname = new char[strlen(pn) + 1];
if (pname != 0) strcpy(pname, pn);
size = strlen(pn);
} void main()
{
name Obj1("NoName");
cout << hex << "obj1的地址是:" << &Obj1.pname << endl;//此处是输出指针变量的地址
cout << hex << "obj2的地址是:" << (void *)Obj1.pname << endl;//此处是输出指针变量的值
}
c++中的printf、和cout和cin后面跟指针的问题的更多相关文章
- 两种方法:VS2008下C++窗体程序显示控制台的方法——在QT程序中使用cout和cin
老蔡写了一个基于QT的窗体程序,而过去写的类的调试信息都是用cout显示的,苦于窗体程序无法显示cout信息很多信息都看不到,于是就想到让控制台和窗体同时显示.显示控制台方法如下 1.项目(或者叫“工 ...
- c++ cout、cin、endl
cout是标准输出流对象,<<是输出操作符:cin是标准输入流对象,>>是输入操作符:endl是换行符操作符.他们都属于C++标准库,所以都在std的名字空间里.所以要在开头写 ...
- shell中awk printf的用法
打印输出时,可能需要指定字段间的空格数,从而把列排整齐.在print函数中使用制表符并不能保证得到想要的输出,因此,可以用printf函数来格式化特别的输出. printf函数返回一个带格式的字符串给 ...
- Linux内核中的printf实现【转】
转自:http://www.cnblogs.com/chenglei/archive/2009/08/06/1540702.html 从main.c中的printf开始读这个函数. 首先看printf ...
- 转载:shell中awk printf的用法
转载:http://www.linuxawk.com/jiaocheng/83.html 6. printf函数 打印输出时,可能需要指定字段间的空格数,从而把列排整齐.在print函数中使用制表 ...
- c++中的对象引用(object reference)与对象指针的区别
★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需 ...
- C++中怎么获取类的成员函数的函数指针?
用一个实际代码来说明. class A { public: staticvoid staticmember(){cout<<"static"<<endl;} ...
- C++中vector::data()使用心得和对自定义类型指针运算符的默认重载
一.C++ vector::data()函数 返回值类型:vector的基类 返回值:Returns a pointer such that [data(), data() + size()] is ...
- fprintf输出到文件中,sprintf输出到字符串中. 如: fprintf(fp,"%s",name); fp为文件指针 sprintf(buff,"%s",name); buff为字符数组
fprintf输出到文件中,sprintf输出到字符串中. 如: fprintf(fp,"%s",name); fp为文件指针 sprintf(buff,"%s" ...
随机推荐
- Python:pandas(三)——DataFrame
官方文档:pandas之DataFrame 1.构造函数 用法 pandas.DataFrame( data=None, index=None, columns=None, dtype=None, ) ...
- kNN(k近邻)算法代码实现
目标:预测未知数据(或测试数据)X的分类y 批量kNN算法 1.输入一个待预测的X(一维或多维)给训练数据集,计算出训练集X_train中的每一个样本与其的距离 2.找到前k个距离该数据最近的样本-- ...
- 【AIA】培训感悟
最主要一个感悟,有钱了一定要买香港的保险.存个100万,年薪30就行,先把这个做目标.
- 判断jQuery是否加载,如果未加载则加载
一般情况返回的js这么写history.go(-1) 但是如果是从别人分享过来的,就没有反应 所以就做个判断,没有上一页就返回首页 if (typeof jQuery == 'undefined') ...
- 华为交换机配置ACL详细步骤
ACL 介绍 #2000-2999普通ACL,根据源IP过滤 #3000-3999高级ACL,根据源目的端口和源目的地址等过滤 #4000-4999二层ACL,根据源目的MAC等过滤 配置举例: 拒绝 ...
- vue监听页面中的某个div的滚动事件,并判断滚动的位置
在开发中常常会遇到这样一个vue页面,页面分为左右两部分,左边是目录树,右边是一个类名为xq-box的div,在xq-box中多个div上下并列布局,每个div中的内容就对应着左边目录树中的相应节点, ...
- ZYNQ 驱动初始化套路--UART串口
@ 目录 UART 串口 GPIO之 MIO控制 LED 套路如下: 1.定义硬件信息结构体 namePs_Config *Config; 2.定义驱动信息结构体 namePs name_Ps; 3. ...
- MySQL数据库阶段学习目录
MySQL数据库学习目录 MySQL数据库初识 MySQL的库表详细操作 MySQL行(记录)的详细操作 快捷使用数据库.表.表内容增删改查 MySQL之单表查询 MySQL之多表查询 Navicat ...
- Java中对文件的处理01-递归删除
package com.ricoh.rapp.ezcx.admintoolweb.util; import java.io.BufferedInputStream; import java.io.Bu ...
- tensorflow2.4与目标检测API在3060显卡上的配置安装
目前,由于3060显卡驱动版本默认>11.0,因此,其不能使用tensorflow1版本的任何接口,所以学习在tf2版本下的目标检测驱动是很有必要的,此配置过程同样适用于任何30系显卡配置tf2 ...