c++-C++ 字符串指针输出的为什么是完整字符串,而不是地址

问题描述

C++ 字符串指针输出的为什么是完整字符串,而不是地址
char str[3] = {'a','b',''};
cout<<str<<endl;    //1

char *pChar = str;
cout<<pChar<<endl;  //2

int in[3] = {1,2,3};
cout<<in<<endl;     //3
 以上代码,1和2处的str、pChar不是指针么?为什么输出的是“ab”,而不是一个地址?
3处的in输出的就是个地址。

解决方案

cout对此有重载,如果是字符串,输出的是内容。你可以做一个强制类型转换,让它调用整数的重载版本
cout<<(int)pChar<<endl;

解决方案二:

cout的operator的 << 有重载char*等参数,会一直输出到结束符。可以查看源码

解决方案三:

 //自定义拷贝构造函数
classname(const classname &ob)
{
    //自定义拷贝构造函数的函数体
}
// 其中ob是用来初始另一个对象的对象的引用

class StringData{
private: char *str;
public:
    StringData(char *s){
        str=new char[strlen(s)+1];
        strcpy(str,s);
    }
    StringData(const StringData &p){ // 拷贝构造函数
            str=new char[strlen(p.str)+1];
            strcpy(str,p.str);
    }
    ~StringData() { delete str; }
    //…
};
int main()
{

    StringData x(“abc”);
    StringData y(x);
}

拷贝构造函数是一种特殊的构造函数。**它用于依据已存在的对象建立一个新对象。**
如果一个对象里面有指针成员,并且这个指针已经动态分配空间了,同时,对象有析构函数对这个指针进行释放。如上面那个例子,如果我们通过这个对象创建一个新对象:
A a("123");
A b = a; // 调用拷贝构造函数

如果我们没有自定义拷贝构造函数,导致对象 a 和 b 的指针成员指向同一个地址空间,当对象生命周期结束时,a 和 b 都会调用析构函数,最后导致,这个指针会被释放 2 次,导致内存出问题。

所以,对象有指针成员,尽量自定义拷贝构造函数。

解决方案四:

一楼是傻逼,乱讲的,2,3楼讲的是正确的,就是因为操作符(<<)重载的原因。

解决方案五:

别激动,本来是回答 《如何自定义拷贝构造函数》, 后来粘贴错了,又不能删除。

可以点击链接,验证一下。如何自定义拷贝构造函数

解决方案六:

本来是回答 《如何自定义拷贝构造函数》, 后来粘贴错了,又不能删除。

可以点击链接,验证一下。如何自定义拷贝构造函数如何自定义拷贝构造函数

解决方案七:

路过,cout<<&pChar<<endl ,试试这样。确实是重载函数的问题,cout<<pChar<<endl; //2和cout<<in<<endl; //3 他们调的不是同一个函数

解决方案八:

需要输出地址时可用“&变量”,前面加上cout<<即可,因C++语言与C语言不同所致。

时间: 2024-10-28 09:30:56

c++-C++ 字符串指针输出的为什么是完整字符串,而不是地址的相关文章

c# 字符串 倒序输出-请问各位一个C#字符串倒序输出的问题

问题描述 请问各位一个C#字符串倒序输出的问题 大家好,新学C#,在字符串倒序输出时遇到了一点问题,想请问大家. static void Main(string[] args) { Console.WriteLine("请输入字符串:"); int i; string myString = Console.ReadLine(); for (i = myString.Length - 1; i >= 0; i--) { Console.WriteLine("转换后的字符串

C++ 用指向指针的指针的方法对5个字符串排序并输出时遇到的问题

问题描述 C++ 用指向指针的指针的方法对5个字符串排序并输出时遇到的问题 //用指向指针的指针的方法对5个字符串排序并输出 void sort(char **p) { char* temp=new char;//为什么没有长度呢?这么可以没有长度呢?? for(int j=0;j<5;j++) { for(int k=j;k<5;k++) { if(strcmp(p[j],p[k])>0) { temp=p[j]; p[j]=p[k]; p[k]=temp; } } } } int m

c++-C++中vector容器存放字符串,输出错误

问题描述 C++中vector容器存放字符串,输出错误 #include<iostream> #include<vector> #include<string> using namespace std; int main() { vector<char*> Sentence; vector<char*>::iterator p; char ch[100]=""; while(cin.getline(ch,100,'n')) {

c 字符串指针内存问题-C 字符串指针内存问题

问题描述 C 字符串指针内存问题 char * str="new"; str 的值是否是"new"字符串在常量存储区的地址? 用cout<<str ;直接输出结果为什么是new ? 解决方案 嗨, str确实是指向new字符串的指针,而且cout<<str输出new没有任何问题的. 猜测的你的疑惑:为什么不输出new字符串地址值? cout使用<<对待输出的不同数据类型对象操作进行了重载,用cout<<输出str时,c

C语言 字符串指针详解及示例代码_C 语言

C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这在<C语言字符数组和字符串>中已经进行了详细讲解,这里不妨再来演示一下: #include <stdio.h> int main(){ char str[] = "http://c.biancheng.net"; int len = strlen(str), i; //直接输出字符串 printf("%s\n", str); //每次输出一个字符 for(i=0; i<

VC++字符串格式输出问题?

问题描述 VC++字符串格式输出问题? 如上如所示,我想将一个LPCTSTR型字符串格式化输出,但sprintf貌似不能实现这个功能,我想转换的结果也是LPCTSTR类型以作为loadBitmap()的参数,请问我该怎么办?谢谢! 解决方案 使用Fromat函数,比如: CString path: path.Fromat(_T("FlashDisk:picSrc%s.bmp"), name); 解决方案二: sprintf有对应的宽字符版本的wsprintf我记得好像是 解决方案三:

php实现字符串反转输出的方法

 本文实例讲述了php实现字符串反转输出的方法.分享给大家供大家参考.具体分析如下: php中带有一个很简单的函数用于字符串反转,即strrev() <?php print strrev('This is not a palindrome.'); ?> 输出结果如下 .emordnilap a ton si sihT 希望本文所述对大家的php程序设计有所帮助. 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php ,

c语言-输入一个错位敲出的字符串,输出打字员本来想打出的句子

问题描述 输入一个错位敲出的字符串,输出打字员本来想打出的句子 #include char *s = ""`1234567890-=QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM./"";int main(){ int i c; while((c = getchar()) != EOF) { for(i = 1; s[i] && s[i] != c; i ++); if(s[i]) putchar(s[i-1]); else putch

java-Java中如何截取字符串数组中一段数字按大小进行排序,再输出整个排序后的字符串?

问题描述 Java中如何截取字符串数组中一段数字按大小进行排序,再输出整个排序后的字符串? String[] meg ={"1#zhang#3207237","2#Wang#3207232"...}根据最后的数字大小排序后输出 解决方案 帮助lz实现了一下,望采纳 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.uti