为什么我们在存储值时使用& (ampersn)
登录scanf()
。
PS:我知道它用于将变量的值存储在适当的地址。
还有其他适当的原因吗?
答案 0 :(得分:3)
在C语言中,您只能按值传递参数 。这意味着当您将参数传递给函数时,该值将被复制。
C没有通过引用传递,但是可以使用指针进行模拟。
例如
#include <stdio.h>
void f1(int a)
{
a = 123; // Modify local copy
}
void f2(int *a)
{
*a = 234; // Modify value where a is pointing
}
int main(void)
{
int a1 = 0, a2 = 0;
f1(a1);
f2(&a2);
printf("a1 = %d, a2 = %d\n", a1, a2);
}
以上程序将打印
a1 = 0, a2 = 234
这是因为当f1
修改其自变量的值时,它仅修改了其本地副本。原始文件(a1
函数中的变量main
)未被修改。
另一方面,函数f2
模拟按引用传递。调用f2
时,我们使用地址运算符a2
将指针传递给变量&
。然后,该函数可以取消引用该指针以获取其指向的位置(a2
函数中的变量main
)并对其进行修改。
由于scanf
函数需要修改变量,因此您无法传递其当前值的副本,因此需要传递指向变量的指针,就像在上例中调用f2
时一样。
答案 1 :(得分:2)
在#include "opencv2/opencv.hpp"
#include "opencv2/videoio.hpp"
using namespace cv;
int main(int, char**)
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return -1;
cap.set(CV_CAP_PROP_FRAME_WIDTH,1920);
cap.set(CV_CAP_PROP_FRAME_HEIGHT,1080);
Mat edges;
namedWindow("camera",1);
for(;;)
{
Mat frame;
cap >> frame; // get a new frame from camera
imshow("camera", frame);
if(waitKey(30) >= 0) break;
}
return 0;
}
中,所有函数参数均按值传递。
这意味着函数无法修改调用方传递的参数。
除了使用c
之外,可以做的是将 pointer 类型(用于数组或对象)作为参数,并对其进行修改通过解引用这些指针来排列数组或对象。
这是return
使用的方法。 scanf
也使用了scanf
。