cout 输出数组名和字符数组名/ 输出地址,cout对字符数组重载

博客主要分析了C++中字符数组的输出情况,指出以字符串字面量初始化的字符数组可直接用cout输出,列表初始化的需加结束符‘\\0’,否则会多输出字符;其他类型数组cout输出首地址。还介绍了输出char数组首地址的方法,以及可使用C++11的范围for循环遍历数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

  1. char a[] = {'a','b','c'};

  2. char b[] = "abc";

  3. char c[] = { 'a','b','c','\0'};

  4. int d[] = {1,2,3 };

  5. cout << a << endl;

  6. cout << b << endl;

  7. cout << c << endl;

  8. cout << d << endl;

结果:

分析:

1.以字符串字面量初始化的字符数组cout数组名可以输出整个数组;

2.列表初始化的字符数组必须加上字符串结束符‘\0’才能cout数组名才能正确输出整个数组

3.列表初始化的字符数组没加加‘\0’的话,可以看见字符数组打印出来了,但是后面多了几个字符,因为cout不知道什么时候结束

4.而其他类型的数组,比如int,cout数组名输出的是这个数组的16进制地址,后面会验证这一点。

为什么会出现这种情况呢?不是说数组名代表数组的首地址吗?

因为cout对于cha[]重载了<<运算符呗。

另外强调一点,数组b和c的长度都是4字节。

 

那么我们怎么输出char数组的首地址呢,用printf:

 
  1. printf("%p \n", c);

  2. printf("%p \n",d);

也可以这样:

printf("%p \n", &d[0]);

%p表示以16进制的形式输出。

数组d的地址怎么跟上面不一样,因为这是运行两次的截图。。

--------------------------------------------------

以后遍历数组可以多使用范围for循环,自动检测,节省时间,比如输出上面定义的数组d:

 
  1. for (auto v: d) {

  2. cout << v << " ";

  3. }

  4. cout << endl;

注:这是C++11新特性,vs2010不支持的,我用的vs2015.

### C++ 中将字符数组转换为 `std::string` 的方法 在 C++ 编程中,可以方便地通过多种方式将字符数组 (`char[]`) 转换为标准库中的字符串对象 (`std::string`)。以下是几种常见的方式: #### 使用构造函数初始化 可以直接利用 `std::string` 类的构造函数来完成这一操作。 ```cpp #include <iostream> #include <string> int main() { const char char_array[] = "Hello, world!"; std::string str(char_array); std::cout << "Original character array: " << char_array << '\n'; std::cout << "Converted string object: " << str << '\n'; return 0; } ``` 此段代码展示了如何使用 `std::string` 构造函数直接从字符数组创建一个新的字符串实例[^1]。 #### 利用赋值运算符 除了构造函数外,还可以采用简单的赋值语句来进行转换。 ```cpp #include <iostream> #include <string> int main() { const char another_char_array[] = "Another example."; std::string new_str; // Assigning the value of a char array to an existing string variable. new_str = another_char_array; std::cout << "Assigned string content is now: " << new_str << '\n'; return 0; } ``` 这段程序说明了即使对于已经声明过的 `std::string` 变量,仍然可以通过简单赋值的方式来更新其内容至新的字符序列。 #### 复制指定长度的内容 当只需要复制部分而非全部字符时,则可调用带参数版本的构造器或成员函数 `assign()` 来限定范围。 ```cpp #include <iostream> #include <string> int main() { const char long_text[] = "This text contains more than just hello."; size_t length_to_copy = 5; // Number of characters we want to copy. // Using constructor with specified number of elements and pointer offset. std::string partial_string(long_text, length_to_copy); std::cout << "First few letters are: " << partial_string << '\n'; // Alternatively using assign method which also allows specifying start index. std::string alternative_partial; alternative_partial.assign(long_text + 5, 7); // Start from position 5, take next 7 chars. std::cout << "Next segment after skipping some chars: " << alternative_partial << '\n'; return 0; } ``` 上述例子不仅介绍了基于特定起始位置数量的选择性拷贝功能,还提供了两种不同的实现途径——即构造函数重载以及成员函数的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值