C#中的C指针

时间:2020-03-05 18:53:58  来源:igfitidea点击:

这是C#中的函数声明吗?

void foo(string mystring)

与C中的这个相同:

void foo(char *)

即在C#中,被调用函数是否在幕后接收到指针?

解决方案

回答

从本质上讲,是的。在C#中,字符串(实际上是System.String)是引用类型,因此,在调用foo()时,它将接收指向堆中字符串的指针。

回答

在这种特定情况下,它更像是:

void foo(const char *);

.Net字符串是不可变的,并通过引用传递。但是,一般来说,Creceives指向幕后对象的指针或者引用。

回答

cstring中的no是unicode。
在cit中不称为指针,而是引用。

回答

如果意思是允许该方法访问字符空间的内容,则答案为是。

回答

是的,因为字符串的大小是动态的,所以在后台必须有堆内存

但是它们并不相同。

在c中,指针指向一个字符串,该字符串也可以在其他地方使用,因此更改它会影响其他位置。

回答

对于值类型(int,double等),该函数将接收值的副本。对于其他对象,它是指向原始对象的引用。

字符串之所以特殊是因为它们是不可变的。从技术上讲,这意味着它将通过引用,但是在实践中,它将表现得非常类似于值类型。

我们可以使用ref关键字强制值类型传递引用:

public void Foo(ref int value) { value = 12 }
public void Bar()
{
    int val = 3;
    Foo(ref val);
    // val == 12
}

回答

尽管C#的智能指针更像C ++的智能指针,但在C#中还是有一些指针。 char *与System.String并不完全相同,因为指向char的指针通常表示字符数组的开始,而Cstring是具有长度字段和字符数组的对象。指针指向外部结构,该结构指向wchar_t数组之类的东西,因此存在一些间接作用,其中包含Cstring和更宽的字符以支持Unicode。

回答

否。在C语言(和所有其他.NET语言)中,String是一流的数据类型。它不仅仅是一个字符数组。我们可以在它们之间来回转换,但是它们的行为并不相同。 String类有许多可用的字符串处理方法(例如" Substring()"和" StartsWith"),通常不适用于数组,而字符数组只是其中的一个实例。

回答

据我所知,C中的所有类(不确定其他类)都是引用类型。

回答

任何非"值类型"(本质上涵盖枚举,布尔值和内置数字类型)的内容都将"通过引用"传递,这可以说与通过引用或者指针传递的C / C ++机制相同。在语法和语义上,它与通过引用传递的C / C ++本质上相同。

但是请注意,Cstrings是不可变的,因此即使通过引用传递了该字符串,也不能在不创建新字符串的情况下编辑该字符串。

还要注意,无论C是值类型还是引用类型,都不能在C#中将参数作为" const"传递。

回答

尽管这些在语义上确实是等效的(例如,代码正在使用字符串执行某些操作),但是C#(类似于Java)使指针完全脱离了日常使用,即使在那时,它们也被转移到了诸如向本机OS功能过渡的领域。是框架类,可以很好地包装它们,例如SafeFileHandle。

长话短说,不要用C#中的指针思考。