在 C# String 构造函数 String(Char*) 中,为啥构造函数不期望指向字符数组的指针?

Posted

技术标签:

【中文标题】在 C# String 构造函数 String(Char*) 中,为啥构造函数不期望指向字符数组的指针?【英文标题】:In the C# String constructor, String(Char*), why doesn't the constructor expect a pointer to an array of characters?在 C# String 构造函数 String(Char*) 中,为什么构造函数不期望指向字符数组的指针? 【发布时间】:2021-01-03 18:28:33 【问题描述】:

我使用 C# 已有好几年了,但从未在 C# 中使用过指针。我正在使用 String API,但我不知道为什么 char* 实际上是一个数组而不是单个字符。

API 定义:

[System.CLSCompliant(false)]
public String (char* value);

API 文档的 sn-p:

参数

价值 Char*

指向以空字符结尾的 Unicode 字符数组的指针。


声明char* singleChar 是指向单个字符的指针吗?指针文档example 似乎是这么说的。

那么,为什么/如何它也可以是指向数组的指针?为什么参数类型不是char[]*

【问题讨论】:

指向数组的指针总是指向它的第一个元素的指针 在这种情况下,“数组”(实际上是一个连续内存区域)由空终止符(代码为 0 的字符)终止 更正确的描述是“指向以空字符结尾的 Unicode 字符序列的指针”,但经常使用术语数组,即使不正确...fixed (char* pch = "Hello world") string str2 = new String(pch + 5); 很少有人会说@例如987654327@是一个数组 【参考方案1】:

C# 中的 char[]* 在技术上是不可能的,因为托管类型(在本例中为 char[])不能是指针,更正确的是 char**。有一个指向指针的指针有点令人困惑,但可以将其视为一个 char 数组的数组。

不安全的 C# 代码中的指针只是对内存区域的引用。在C 语言中,char 数组通常使用字符串的连续内存块以空值结尾(字节值为 0)。在 C# 中也是如此,char* 只是一个指向 char 类型的连续内存块的指针。

例子:

Memory address 0x10000000 : h
Memory address 0x10000002 : e
Memory address 0x10000004 : l
Memory address 0x10000006 : l
Memory address 0x10000008 : o
Memory address 0x1000000A : \0

在 C# 中,您可以使用 char* ptr = (char*)0x10000000 - 并且内存将指向字符 hello\0

您可以使用 fixed 关键字将单个 C# 数组转换为 char*,该关键字将 char 数组固定下来,防止垃圾收集或内存移动。

char[] chars = new char[64];
// fill chars with whatever
fixed (char* charPtr = chars)


上面例子中的chars也可以是string

希望其中一些信息有用。

【讨论】:

以上是关于在 C# String 构造函数 String(Char*) 中,为啥构造函数不期望指向字符数组的指针?的主要内容,如果未能解决你的问题,请参考以下文章

C#在自己的构造函数之后调用基类的构造函数?

如何引入初始化构造函数? C# CS0236

高手请进,关于string类。

C#访问器和初始化[重复]

C++ std::string 构造函数

关于C++的STRING的成员函数汇总