我对以下函数的理解是它要求整数变量的地址.
void MyFunction(int & myParameter)
Run Code Online (Sandbox Code Playgroud)
但在我的代码中,我有:
int myVar;
myFunction(&myVar)
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误说:没有已知的从'int*'到'const int&'的转换.
当我没有'&'传递'myVar'时,编译器很高兴.我有点困惑,这里发生了什么.在此上下文中,指针符号'*'和地址符号'&'之间有什么区别?我什么时候应该使用?使用'&'时c和c ++之间是否有区别?提前致谢.
打电话吧myFunction (myVar).然后编译器将通过引用传递您的变量,这意味着,如果您在函数中更改该变量,则此变量也将在函数外部更改.
至于*和之间的区别&.如果你有一个类型的变量(让它是int)并且你想得到它的指针,你可以使用运算符应用获取地址&:
int i;
int* pointer_to_i = &i;
Run Code Online (Sandbox Code Playgroud)
如果你的函数需要int*,那么你需要传递一个&i或pointer_to_i(它们显然是同一个东西).如果您的函数采用int或int&,那么您应该通过i.
通过值(如void f(int);)获取其参数的函数处理其参数的副本.此函数对此参数所做的所有更改在外部都不可见.如果函数通过指针或引用获取其参数,则对参数所做的所有更改都在外部可见.
当您将指针作为参数时,您需要:
NULL在C或nullptrC++中*i = 0将零置于指向的内存中i.除此之外,通过指针(如void f(int*){…})或通过引用(类似void f(int&){…})传递实际上仅在语法上有所不同并且具有相同的含义.
指针可以指向任何地方,可以指向另一个值.相反,引用始终指向某些内容,并始终指向相同的内存位置.
这是简短的.但你应该阅读一些不错的C++书籍,有很多棘手的案例有引用或指针.
最后,一个助记符规则.
int i; //< that's a plain number
int* pi = &i; //< that's a pointer to int
int (*pi_2) = &i; //< the same pointer to int
int j = *pi_2; //< here *pi_2 is again an int just as above
Run Code Online (Sandbox Code Playgroud)
也就是说,这个指示指针的星号可以预先添加到变量中,从而从其类型中"剥离"一个间接级别.这种解释在形式上并不完全正确,但有时候很容易理解会发生什么.
你的理解是不正确的.这是一个参考.
你这样称呼它:
myFunction(myVar);
Run Code Online (Sandbox Code Playgroud)
在函数内部,myParameter将是相同的myVar,不像普通函数调用(没有&),其中myParameter将是一个值的副本myVar.
C中不存在引用参数,你必须使用指针参数(int *myParameter).
所以,&在参数列表中并不意味着"指针",它意味着参考.