我是一名C#/Java开发人员,正在努力学习C++。当我试图学习指针的概念时,我突然想到我以前一定处理过这个概念。如何仅使用.NET或Java开发人员熟悉的概念来解释指针?我真的从来没有处理过这个问题吗,它对我来说只是隐藏的,还是我一直在使用它,而没有调用它?
发布于 2011-03-03 07:18:39
解释堆栈和堆之间的区别以及对象的位置。
诸如结构( C++和C#)之类的值类型被放入堆栈。引用类型(类实例)被放到堆上。指针(或引用)指向该特定实例在堆上的内存位置。
引用类型是关键字。在C++中使用指针就像在C#中使用ref
关键字一样。
托管应用程序使得使用这些东西变得容易,因此.NET开发人员可以省去麻烦和困惑。幸好我不再做C语言了。
发布于 2011-03-03 07:30:20
C#中的引用与C++中的指针的作用相同,没有所有杂乱的语法。
考虑以下C#代码:
public class A
{
public int x;
}
public void AnotherFunc(A a)
{
a.x = 2;
}
public void SomeFunc()
{
A a = new A();
a.x = 1;
AnotherFunc(a);
// a.x is now 2
}
因为类是引用类型,所以我们知道我们正在向AnotherFunc
传递一个现有的A
实例(与复制的值类型不同)。
在C++中,我们使用指针来明确这一点:
class A
{
public:
int x;
};
void AnotherFunc(A* a) // notice we are pointing to an existing instance of A
{
a->x = 2;
}
void SomeFunc()
{
A a;
a.x = 1;
AnotherFunc(&a);
// a.x is now 2
}
发布于 2011-03-03 07:40:23
“如何仅使用.NET或Java开发人员熟悉的概念来解释指针?”我建议确实有两件不同的事情需要学习。
第一个是如何使用指针和堆分配内存来解决特定问题。有了适当的风格,例如使用shared_ptr<>,这可以以类似于Java的方式来完成。shared_ptr<>与Java对象句柄有许多共同之处。
然而,其次,我认为指针通常是一个根本较低级别的概念,Java和较小程度的C#故意隐藏。在C++中编程而不移动到那个级别肯定会有一大堆问题。您需要从底层内存布局的角度考虑,并将指针视为指向特定存储部分的指针。
试图从更高的概念来理解这个较低的层次将是一条奇怪的道路。
https://stackoverflow.com/questions/5174725
复制相似问题