用C语言在scanf()中使用[ampersn]有什么用

时间:2018-07-17 10:34:33

标签: c

为什么我们在存储值时使用& (ampersn)登录scanf()

PS:我知道它用于将变量的值存储在适当的地址。

还有其他适当的原因吗?

2 个答案:

答案 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