【问题标题】:Why is char* not copying into the vector but string is copied?为什么 char* 不复制到向量中,而是复制了字符串?
【发布时间】:2017-02-24 17:43:34
【问题描述】:

好的,当我尝试下面的代码时,我正试图找出一个问题:

#include <iostream>
#include <vector>
#include <stdint.h>
#include <string>
#include <Windows.h>
using namespace std;

int main(){
    vector<char*> v;
    char s[10];
    std::cout << "Enter Values :\n";
    for (int i = 0; i<5; i++){
        cin >> s;
        v.push_back(s);
    }

    std::cout << "\n\n\nPrinted Values :\n";
    for (auto ss : v){
        cout << ss << "\n";
        cout << "------------\n";
    }
    system("pause");
    return 0;
}

这是我收到的输出:

Enter Values :
aaaa
ssss
ddddd
ffff
errrr



Printed Values :
errrr
------------
errrr
------------
errrr
------------
errrr
------------
errrr
------------

但现在我把“char*”改成了“string”:

#include <iostream>
#include <vector>
#include <stdint.h>
#include <string>
#include <Windows.h>
using namespace std;

int main(){
    vector<string> v;
    string s;
    std::cout << "Enter Values :\n";
    for (int i = 0; i<5; i++){
        cin >> s;
        v.push_back(s);
    }

    std::cout << "\n\n\nPrinted Values :\n";
    for (auto ss : v){
        cout << ss << "\n";
        cout << "------------\n";
    }
    system("pause");
    return 0;
}

现在,它将所有数据存储到向量中:

Enter Values :
aaaa
ssss
ddddd
ffff
errrr



Printed Values :
aaaa
------------
ssss
------------
ddddd
------------
ffff
------------
errrr
------------

我的问题是,为什么 char* 没有存储在向量中,而字符串却存储在向量中?

【问题讨论】:

  • char* 只是一个指针,而std::string 是一个类。数组不会自动复制。

标签: c++ string for-loop vector char


【解决方案1】:

因为 char* 的向量将存储字符指针(字符数组 s 的第一个 char 的内存地址),而不是字符本身。存储字符的唯一地方是您的数组 s 本身。但这会被

请注意,在 C++ 中,数组(也是 char 数组)的名称被转换为指向其第一个元素的指针。

【讨论】:

  • "请注意,在 C++ 中,数组(也是 char 数组)的名称是指向其第一个元素的指针" 不。在大多数情况下它会转换为这样的指针,但它不是同样的事情。
  • 谢谢,看来我要在这里学习一些东西了。转换为“内存中的值更改”或“类型解释不同”?
  • 转换后会有不同的值和不同的类型。内存中的任何内容都不一定会更改,因为值的结果不是左值。最简单的区分示例是sizeofsizeof(arrayname) 给出了整个数组的大小;如果arrayname 是一个指针,那么它将给出一个指针的大小。所以arrayname实际上是指整个数组;如果您在需要它的上下文中使用它(根据语言规则),它会转换为该数组的指针。 (在这种情况下,“转换”并不意味着改变了原件)。
  • 在 C++ 中的错误声明 “数组(也是字符数组)的名称是指向其第一个元素的指针。” 被删除之前,不能投票。
  • 好吧,现在你可以了;)
猜你喜欢
  • 2019-03-04
  • 2014-08-30
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
相关资源
最近更新 更多