我听说C++引用变量是使用指针实现的。在我开始使用C++之前,我已经研究了一些C代码,因为我希望在C语言中有一些我可以与之相关的东西。是否有人真的有关于如何使用指针实现它的示例?
我一直在研究这个问题,这就是我所发现的。但是,我不确定它是否合法,因为我以前无法在C++文件中正确地运行它。如有任何答案,将不胜感激!)
int& = *(int const *)发布于 2014-08-09 20:10:56
引用的含义与常量指针相同。
引用和指针的代码是相同的,至少在MSVC2013中是这样的。
例如:
int u=1,v=3, w;
int& x = u; // initialize reference
w = x; // x is synonym for u;
x++;
int *y = &u; // initalize pointer
w = *y; // y points to u
(*y)++; 初始化在这两种情况下都会生成:
lea eax, DWORD PTR _u$[ebp]
mov DWORD PTR _x$[ebp], eax ; of course in the case of the pointe _y$ instead of _x$. 在这两种情况下,转让都会产生:
mov eax, DWORD PTR _x$[ebp]
mov ecx, DWORD PTR [eax]
mov DWORD PTR _w$[ebp], ecx甚至增量也会生成相同的代码。
生成的代码是相同的,无论是指针、const指针还是指向const的poitner (在后一种情况下,++不工作)。确保const是const是编译器的优点。
现在在语法上有一个微妙的区别:
int& x = u; // initialize reference
int *y = &u; // initalize pointer
int const *z = &u; // initialize pointer to "const int". Pointer itself is not const !
int * const a = &u; // initialize "const pointer" to "int", which is basically a reference. 有了这些定义:
//(*z)++; // invalid because the it points to a const int.
z = &w; // valid because pointer intself is not const以及:
(*a)++; // valid because the it points to an int.
// a = &w; // invalid because it's a const pointer 所以您可以说int&与int * const相当(这里我不使用'=‘,因为它是为operator=保留的,看起来像是语法错误!)
当然,对于引用,您总是使用它的名称,就好像它是一个真正的变量(ex:x++),而对于const指针,您总是必须取消引用(又名:(*x)++)。意思一样,但语法不同。
发布于 2014-08-09 20:11:35
编译器可以以任何方式实现引用,包括完全优化某些引用。
你可以想到引用
T& r = o;作为
T* const pr = &o;
#define r (*pr)它可以很好地解释lvalue引用的大多数属性,但这个概念图不包括临时的生存期扩展和临时初始化。
它“解释”
但请记住,这只是一幅概念性的图片:虽然它很可能是大部分生成代码的基本现实,但绝不是编译器以这种方式实现引用的要求。
您可能会发现关于C++常见问题中引用的一节具有指导性。
发布于 2014-08-09 19:50:41
在C中,当您将变量用作函数的参数时,它是通过值发送的。如果函数应该更改变量,则必须将参数作为指针发送。
int x = 5;
void addtwo(int* param)
{
*param += 2;
}
addtwo(&x); // This will send a pointer to x to the function addtwo在C++中,您可以发送一个引用:
void addtwo(int& param)
{
param += 2;
}
addtwo(x); // This will send a reference to x to the function addtwo在这个简单的例子中,这看起来并没有多大的区别,但是在第二个例子中,它看起来就像param没有被取消引用一样。但实际上是的,因为它是作为参考书发送的。尽管param看起来不像指针(而且它不是--它是一个引用),但函数addtwo被发送给x的地址,就好像它是一个指针一样。差别是微妙的,但具体的。
https://stackoverflow.com/questions/25222356
复制相似问题