C++中字符型变量的地址输出
来源:互联网 发布:js div 编辑:程序博客网 时间:2024/04/28 13:41
在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";
charstr3[]={'s','t','r','i','n','g','3','/0'};
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类型变量和字符串变量的地址了。
- C字符变量地址输出
- C++中字符型变量的地址输出
- C++中字符型变量的地址输出
- C++中字符型变量的地址输出
- [转] C++中字符型变量的地址输出
- C++ cout输出 字符型变量的地址
- C++ cout输出 字符型变量的地址
- C语言中以十六进制输出字符型变量会出现'ffffff"的问题
- C语言中以十六进制输出字符型变量会出现'ffffff"的问题
- C语言中以十六进制输出字符型变量会出现'ffffff"的问题
- C语言中以十六进制输出字符型变量会出现'ffffff"的问题
- c++: 关于char型变量与字符串地址的输出
- 关于C++中char 型变量的地址输出
- c++中输出字符的地址
- c++通过cout输出字符变量的地址
- C语言中变量的地址分配
- C语言输出指针变量地址以及指向变量的地址
- C++中cout输出字符型指针地址值的方法
- Bootstrap3轮播
- MySQL性能优化的最佳20+套经验
- QML基本可视化元素--TextInput
- 第九周项目一: 复数类中的运算符重载(续)
- CUDA线性内存分配
- C++中字符型变量的地址输出
- 腾讯历年笔试题(计算机基础)
- MySQL性能优化的最佳20+套经验
- using 的范围用法
- Bootstrap 分页插件的使用
- 1. Two Sum
- [LeetCode] Valid Sudoku
- 图像有用区域 bfs
- 自学Swift-UIKit