【发布时间】:2012-10-13 07:37:07
【问题描述】:
我在 C++ 代码中阅读了 String* 并感到困惑,是否有必要使用 String* ?我可以改用 char* 吗? 例如。 StreamReader 有 ReadLine() 函数,为什么不要求用户先安排一个 char 数组,该函数只是将字符串存储在其中,返回一个 char* 指针,一切正常。
【问题讨论】:
-
你似乎在这里问了两个不同的问题……老实说,这有点令人困惑。
我在 C++ 代码中阅读了 String* 并感到困惑,是否有必要使用 String* ?我可以改用 char* 吗? 例如。 StreamReader 有 ReadLine() 函数,为什么不要求用户先安排一个 char 数组,该函数只是将字符串存储在其中,返回一个 char* 指针,一切正常。
【问题讨论】:
注意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';
}
}
【讨论】:
我不太完全理解您的问题,但 string* 可能指的是字符串数组而不是单个字符串。在这种情况下 char* 将不起作用。希望对您有所帮助。
【讨论】:
在 C# 中,字符串通常由 C# 类型 string 或 .net 类型 String 处理(这是同一件事)。 char* 是 C/C++ 对字符串的思考方式。虽然 C# 中确实存在指针,但它们确实不是要走的路(它们正式不安全)。字符数组将是 char[],而不是 char*。
在 C# 中,类实例存储为引用,结构存储为值。引用基本上是指针的托管版本。如果传递类实例,则通过引用传递对象,如果传递结构,则通过值传递。换句话说,如果您想要将数据作为指向 C++ 中的类/结构的指针传递,您应该使用 C# 类。优点是您可以通过引用传递,并且您可以使用它来做您可以用指针做的事情(如链表)。缺点是如果你把一个类放在一个类中,你会增加重定向的次数(因此也会增加访问时间)。如果您希望将数据存储为值(例如,为了减少类中结构的间接次数),您应该使用结构。结构的优点和缺点是相反的,除了你仍然可以使用in/ref参数通过引用传递结构。
【讨论】: