【问题标题】:string* or char*?字符串* 还是字符*?
【发布时间】:2012-10-13 07:37:07
【问题描述】:

我在 C++ 代码中阅读了 String* 并感到困惑,是否有必要使用 String* ?我可以改用 char* 吗? 例如。 StreamReader 有 ReadLine() 函数,为什么不要求用户先安排一个 char 数组,该函数只是将字符串存储在其中,返回一个 char* 指针,一切正常。

【问题讨论】:

  • 你似乎在这里问了两个不同的问题……老实说,这有点令人困惑。

标签: c++ string pointers char


【解决方案1】:

注意char* 是指向单个字符串或多个字符(字符数组)的指针,而string* 是指向单个或多个字符串对象(数组)的指针。但是,C# 不支持指向托管类型(如字符串)的指针

例子:

    unsafe void f()
    {
        char ch = '3';
        char* cPtr = &ch;
        *cPtr = '4'; // ch == '4'
        fixed (char* ccPtr = new char[30])
        {
            *(ccPtr + 15) = '4'; // arr[15] == '4'
        }
        string* ptr; // error: cannot declare a pointer to managed type
        fixed (char* pptr = new string(new char[] { 'a', 'b', 'c' }))
        {
            pptr[2] = 'd';
        }
    }

【讨论】:

  • 但是我读了很多这样的代码:StreamReader *subs_reader = new StreamReader(subs_file);String *pattern, *replacement;模式 = subs_reader->ReadLine(); replacement = subs_reader->ReadLine(); 当一行中存在一个字符串时。
  • @Rubby 你在哪里读到的?它不是有效的 C#。似乎是旧的托管 C++(后来被 C++/CLI 取代)。
【解决方案2】:

我不太完全理解您的问题,但 string* 可能指的是字符串数组而不是单个字符串。在这种情况下 char* 将不起作用。希望对您有所帮助。

【讨论】:

    【解决方案3】:

    在 C# 中,字符串通常由 C# 类型 string 或 .net 类型 String 处理(这是同一件事)。 char* 是 C/C++ 对字符串的思考方式。虽然 C# 中确实存在指针,但它们确实不是要走的路(它们正式不安全)。字符数组将是 char[],而不是 char*。

    在 C# 中,类实例存储为引用,结构存储为值。引用基本上是指针的托管版本。如果传递类实例,则通过引用传递对象,如果传递结构,则通过值传递。换句话说,如果您想要将数据作为指向 C++ 中的类/结构的指针传递,您应该使用 C# 类。优点是您可以通过引用传递,并且您可以使用它来做您可以用指针做的事情(如链表)。缺点是如果你把一个类放在一个类中,你会增加重定向的次数(因此也会增加访问时间)。如果您希望将数据存储为值(例如,为了减少类中结构的间接次数),您应该使用结构。结构的优点和缺点是相反的,除了你仍然可以使用in/ref参数通过引用传递结构。

    【讨论】:

    • 确实,C# 是一种托管语言,为什么要使用不安全的指针呢?
    猜你喜欢
    • 2021-03-28
    • 2010-10-15
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    相关资源
    最近更新 更多