我刚开始通过大学课程学习C ++。
我正在修改C ++考试,我希望我能问一些关于我不太确定的事情的简单问题。
首先,如果我有这个:
int i = 4;
这两行之间有什么区别:
int* p = &i;
int& r = i;
根据我的理解,此时p和r都像是对我的管道;改变他们的价值会改变我的价值......
其次,关于集会,我在过去的考试中有一个问题就是愚弄我:
mov eax, dword ptr[b]
push eax
mov eax, dword ptr[a]
push eax
call printCode (411186h)
add esp,8
问:以下哪个原型 在拆解时,最佳匹配 汇编代码?A:int printCode(int a,int b)
我的问题是:如果程序集正在移动ptr [a]和ptr [b] ...为什么原型不是int * a,int * b?
谢谢。
答案 0 :(得分:2)
不同之处在于,更改p
的值不会更改i
,它会更改p
指向的内容:
p = &j;
使用p
,您可以通过间接访问和更改i
:
*p = 5;
对于r
,不需要间接,因为r
是i
的别名。另一方面,这意味着无法更改r
以引用不同的变量。即,没有相当于p = &j;
。
你应该把第二个问题分成第二个问题(如果你得到了我的漂移)。
答案 1 :(得分:1)
int* p = &i;
p
是指向i
地址的指针。 p
将是存储在内存中的变量,其中包含i
的(虚拟)内存地址。
int& r = i;
r
是对i
的引用。您应该将引用视为别名:您可以认为r
是名称i
的别名
答案 2 :(得分:1)
int* p = &i;
int& r = i;
第一个语句意味着将变量i的地址赋给指针p。稍后您可以更改指针p的值。
第二个语句是“为变量i创建引用或别名r”。它只是同一个变量的另一个名称。您不能稍后更改引用以指向c ++中的其他变量。
对于装配片段。我感觉到片段指向调用代码。这个电话可能就像是
printCode(*a,*b); // Here a and b are pointer to integers
所以原型是
int printCode(int a,int b)
是对的。
Ferose Khan J
答案 3 :(得分:0)
参考文献或多或少只是语法糖,但它们和指针之间几乎没有差别,这些差异很好地描述here。
对于拆卸问题。
当你说:
mov eax, dword ptr[b]
您要求CPU从指定地址移动值(b)。所以这取决于什么是b。如果b是int*
,那么答案是正确的。
答案 4 :(得分:0)
这两行之间有什么区别:
int* p = &i;
int& r = i;
根据我的理解,此时p和r都像是对我的管道;改变他们的价值会改变我的价值......
如果从字面上理解,那句话就不是真的。更改p
值只会使其指向不同的int
,更改内存指向将更改i
:
int j = 0;
*p = 5; // equivalent to r = 5, or i = 5 (semantically, can be different in assembler)
p = &j; // changes p to point to j instead of i
您应该将指针视为代理对象,这些对象会将您引向真实实例,但可以将其修改为导致不同的位置。引用最好理解为定义右侧对象的别名。你永远不会对引用进行操作,你对引用的对象进行操作,它们是相同的。