【c++】c++中如何打印字符串的地址
2015-10-30 16:00
477 查看
在C++中,如果cout一个字符数组的话,那么它会沿着这个地址,一直输出这个字符串,直到遇到'\0',例如:
char*c="cadn\0hello";
cout<<c<<endl;
输出的结果是:cadn
如果我们自作聪明的想输出第一个字符的地址,例如这样输出:
cout<<&c[0]<<endl;
不幸的是,这样输出的结果依旧不是我们需要的地址。
但是,如果我们回归到C语言的话,例如用printf的话,如下:
printf("%x\n",&c[0]);
幸福的事情发生了,输出的结果是:
46f020
的确是字符串的首地址,但是,如果我们要输出字符串的地址,难道就这一种方法吗?难道我们就不可以用我们C++上的cout达到我们的效果吗?
原因:c是靠%s,%x,%p来区分指针表达式&a[0]的输出形式的;c++没有这个格式控制,只能按一种形式输出,对char*类型的指针值就理解为串输出,所以必须对这个指针表达式做类型转换处理。
例如:
char c='a';
cout<<” &c:”<<&c<<endl;
输出的仍然不是字符变量c的地址。
在C++中,字符串是以空终止符('/0')结尾的字符数组,通过字符串中第一个字符的指针访问字符串。也就是说,字符串的值是字符串中第一个字符的(常量)地址。如下的面3种形式表示:
char *str="string";
charstr2[]="string2";
[align=left]charstr3[]={'s','t','r','i','n','g','3','/0'};[/align]
cout<<"line 1:str="<<str<<endl;
cout<<"line 2:str2="<<str2<<endl;
cout<<"line 3:str3="<<str3<<endl;
运行可知,这3行的输出就是保存的字符串的值,而并非我们认为的地址。那么,我们可以联系到前面&c,其实这就是一个char *的变量,所以,输出的自然就应该是字符串的值。可是,&c保存的字符串是没有终止符的,因此输出的也就是乱码了。
最近,在读到《C++程序设计教程》(第4版)第12章的时候,我才解决了这个疑惑。实际上,C++标准库中I/O类对输出操作符<<重载,在遇到字符型指针时会将其当做字符串名来处理,输出指针所指的字符串。既然这样,我们就别让他知道那是字符型指针,所以得进行类型转换,即:希望任何字符型的指针变量输出为地址的话,都要作一个转换,即强制char
*转换成void *,如下所示:
cout<<"static_cast<void *>(&c)="<<static_cast<void*>(&c)<<endl;
cout<<"static_cast<void *>(str)="<<static_cast<void*>(str)<<endl;
此时,可以看到输出的结果就是char类型变量和字符串变量的地址了。
char*c="cadn\0hello";
cout<<c<<endl;
输出的结果是:cadn
如果我们自作聪明的想输出第一个字符的地址,例如这样输出:
cout<<&c[0]<<endl;
不幸的是,这样输出的结果依旧不是我们需要的地址。
但是,如果我们回归到C语言的话,例如用printf的话,如下:
printf("%x\n",&c[0]);
幸福的事情发生了,输出的结果是:
46f020
的确是字符串的首地址,但是,如果我们要输出字符串的地址,难道就这一种方法吗?难道我们就不可以用我们C++上的cout达到我们的效果吗?
原因:c是靠%s,%x,%p来区分指针表达式&a[0]的输出形式的;c++没有这个格式控制,只能按一种形式输出,对char*类型的指针值就理解为串输出,所以必须对这个指针表达式做类型转换处理。
例如:
char c='a';
cout<<” &c:”<<&c<<endl;
输出的仍然不是字符变量c的地址。
在C++中,字符串是以空终止符('/0')结尾的字符数组,通过字符串中第一个字符的指针访问字符串。也就是说,字符串的值是字符串中第一个字符的(常量)地址。如下的面3种形式表示:
char *str="string";
charstr2[]="string2";
[align=left]charstr3[]={'s','t','r','i','n','g','3','/0'};[/align]
cout<<"line 1:str="<<str<<endl;
cout<<"line 2:str2="<<str2<<endl;
cout<<"line 3:str3="<<str3<<endl;
运行可知,这3行的输出就是保存的字符串的值,而并非我们认为的地址。那么,我们可以联系到前面&c,其实这就是一个char *的变量,所以,输出的自然就应该是字符串的值。可是,&c保存的字符串是没有终止符的,因此输出的也就是乱码了。
最近,在读到《C++程序设计教程》(第4版)第12章的时候,我才解决了这个疑惑。实际上,C++标准库中I/O类对输出操作符<<重载,在遇到字符型指针时会将其当做字符串名来处理,输出指针所指的字符串。既然这样,我们就别让他知道那是字符型指针,所以得进行类型转换,即:希望任何字符型的指针变量输出为地址的话,都要作一个转换,即强制char
*转换成void *,如下所示:
cout<<"static_cast<void *>(&c)="<<static_cast<void*>(&c)<<endl;
cout<<"static_cast<void *>(str)="<<static_cast<void*>(str)<<endl;
此时,可以看到输出的结果就是char类型变量和字符串变量的地址了。
相关文章推荐
- More Effective C++学习笔记(2)
- 主元素(LintCode)
- VC++ Run Time Lib
- 合并排序数组(LintCode)
- C++ typeid 与RTTI(Runtime Type Information)
- 程序猿语文水平挑战卷
- 程序猿语文水平挑战卷
- c/c++中运行外部程序
- c++类继承
- 加一(LintCode)
- 二进制求和(LintCode)
- 解决std::addressof找不到及eclipse lunna+cdt 8.6.0 支持 c++11的设置
- Mandelbrot Set & Julia Set -- 美丽分形 (C++, MFC + BCG + CxImage 实现)
- C++学习笔记---面向对象编程
- C++中内存泄露检测
- 《C++ primer》英文第五版阅读笔记(三)——变量
- C++应用程序的编译过程
- 华为C++笔试题
- C++学习笔记---容器和算法
- C++学习笔记---基本内置类型