C++中cout输出字符型指针地址值的方法

#include<iostream>

#include<string>

using namespace std;

int main(){

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

char *p=c;

cout<<*p<<‘ ‘<<(void*)p<<endl;

cout<<*(p+1)<<‘ ‘<<static_cast<void*>(p+1)<<endl;

cout<<*(p+2)<<‘ ‘<<static_cast<void*>(p+2)<<endl;

system("pause");

return 0;

}

若要打印地址请用void*,否则 p会被认为是字符串。原因:运算符重载的匹配规则

C/C++ code

?


1

2

3

4

5

6

7

8

9

 #include<iostream>

 using namespace std;

 

int main()

 {

     char a;

     char *p=&a;

     cout<<(void*)p<<endl<<a<<endl;

 

先给出通过字符型指针输出字符串的示例代码,如下:

#include
<iostream>

using std::cout;

using std::endl;

int main()

{

    const char *pszStr
=
"this
is a string"
;

    //
输出字符串

    cout
<<
"字符串:" <<
pszStr << endl;

    //
显然不会输出地址值

    cout
<<
"字符串起始地址值:
"
 <<
pszStr << endl;

    return 0;

}

对于要使用cout输出字符串指针地址值,我们可能会产生困惑。曾经我们使用C标准库中的printf函数是如此的方便:

#include
<stdio.h>

int main()

{

    const char *pszStr
=
"this
is a string"
;

    //
输出字符串

    printf("字符串:%s\n",
pszStr);

    //
输出地址值

    printf("字符串起始地址值:%p\n",
pszStr);

    return 0;

}

兄弟,醒醒吧,咱们要写的是C++代码,不要总是抓着C不放嘛。好了,我们来分析一下,由于C++标准库中I/O类对<<操作符重载,因此在遇到字符型指针时会将其当作字符串名来处理,输出指针所指的字符串。既然这样,那么我们就别让它知道那是字符型指针,所以得用到强制类型转换,不过不是C的那套,我们得用static_cast来实现,把字符串指针转换成无类型指针,这样更规范,如下:

#include
<iostream>

using std::cout;

using std::endl;

int main()

{

    const char *pszStr
=
"this
is a string"
;

    

    //
输出字符串

    cout
<<
"字符串:" <<
pszStr << endl;

               

    //
如我们所愿,输出地址值

    cout
<<
"字符串起始地址值:
"
 <<
static_cast<const void *>(pszStr)
<< endl;

    return 0;

}

时间: 2024-12-30 02:38:16

C++中cout输出字符型指针地址值的方法的相关文章

C++中cout输出字符串和字符串型指针地址值的方法以及C语言中的printf用法比较

#include <iostream> using namespace std; #include <stdio.h> int main() { char *pstr = "china"; char *qstr = "america"; char *q = "adf"; char * s; s = "hello"; printf("pstr = %p\n", pstr); /*输出为

C语言中以十六进制输出字符型变量会出现&#39;ffffff&quot;的问题

最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: C代码   char buf[10] = {0}; buf[0] = 0xbf; printf("%2x\n\n\n", buf[0]);            /*在终端将会显示成:ffffffbf*/ buf[1] = 0x7f; printf("%2x\n\n\n", bu

关于指针 用字符数组,字符指针变量输入字符串 动态为字符型指针变量分配内存

#include <stdio.h> #include <iostream> #include<math.h> using namespace std; int main() { //声明字符型数组和指针变量 char str[10]; char *strip=str; //输入输出 cout<<"str="; cin>>str; //用字符数组输入字符串 cout<<"str="<<

cout 输出字符串(指针)常见问题及put,write函数

C++ ostream类为下面的指针类型定义了插入运算符函数: const signed char *; const unsigned char *; const char *; void *; C++用指向字符串存储位置的指针来表示字符串,指针的形式可以是char数组名,显式的char指针或用引号括起来的字符串. 下面是一个简单输出字符串的例子: #include <iostream> using namespace std; int main() { char name[] = "

【Java】Java_08 字符型与布尔值

1.字符型(2个字节) 单引号用来表示字符常量.例如‘A’是一个字符,它与“A”是不同的,“A”表示含有一个字符的字符串 char 类型用来表示在Unicode编码表中的字符 Unicode编码被设计用来处理各种语言的所有文字,它占2个字节,可允许有65536个字符:ASCII码占1个字节,可允许有128个字符,是Unicode编码表中前128个字符 char eChar = 'a'; char cChar ='中'; Unicode具有从0到65535之间的编码,他们通常用从’\u0000’到

64bit机器 C implicit-function-declaration 函数返回指针 地址值截断问题

昨天碰到了问题,32bit机器正常,但64bit机器crash,把问题简化了下 func_a.h 声明了mystruct * func_a( ); func_a.c定义了 mystruct * func_a( ) { //mystruct * inner进行内存申请和赋值 //print  %p, inner-----address1 0x7ff87804b4a8 return inner; } func_b.c调用了func_a函数(但没有包含func_a的声明) mystruct * pt_

C#中的bitmap类和图像像素值获取方法

一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetPixel方法和SetPixel方法:获取和设置一个图像的指定像素的颜色. 2. PixelFormat属性:返回图像的像素格式. 3. Palette属性:获取和设置图像所使用的颜色调色板. 4. Height Width属性:返回图像的高度和宽度. 5. LockBits方法和UnlockBits

字符型指针与字符串常量

字符串常量在编译时系统给定存储位置,可以赋值给字符指针:此时可以通过下标进行访问,但不可以通过下标修改字符串的值. 字符指针指向字符数组时可以修改字符串的值. #include <stdio.h> #include <string.h> int main() { char a[26]; char *b = "abc"; //定义时初始化 b="123"; //可以被重新赋值 //b[1] = 'v'; //不可以被修改 a[1] = b[1]

字符型指针为什么不能修改单个字符?

char *p="hello"; *p='k'; //编译能通过,但是运行到这里会出错 因为p指向的是一个字符串常量. 所以运行时发现要改常量区就会报错. 改成: char* p = (char*)malloc(6); strcpy(p,"hello"); *p='k'; .... free(p);