将变量传递给函数:范围和何时使用&和*?

时间:2011-12-15 21:47:54

标签: c function scope

#include "stdafx.h"
#include "stdio.h"
#include "math.h"
#include "stdlib.h"

void test (int a,int *b, int result[], int serie[]);

int main()
{
    int *serie = malloc(sizeof(int));
    int result[20], a,b, i;
    a=0;
    b=0;

    for (i = 0; i < 20; i++) {
        result[i]=i+10;
        serie[i]=rand();
        printf("result is %d \n",result[i]);
    }

    test(a,&b,result,serie);
    printf("value of a inside main %d \n",a);
    printf("value of b inside main %d \n",b);

    for (i = 0; i < 20; i++) {
        printf("value of result inside main is %d and of serie is %d        \n",result[i],serie[i]);
    }

    getchar();
    return 0;
}

void test(int a, int *b, int result[], int serie[]) {
    int i;
    a=13;
    *b=14;
    printf("value of a inside the function %d \n",a);
    printf("value of b inside the function %d \n",*b);
    for (i = 0; i < 20; i++) {
        result[i]=result[i]*2;
        serie[i]=7;
        printf("value of result inside the function is %d and of serie is %d\n",result[i],serie[i]);
    }
}

基本上,所有这些代码都是看到变量的范围,我写它是为了帮助自己我想用一个函数更改main内的整数值(参见int b)您必须使用&btest(a,&b,result,serie);)调用它,然后在函数*b内调用它。所以我正在尝试使用数组进行那些操作&amp; *但是它们没有用。

看起来你需要做的就是编写数组void test(... int result[],int serie[])并调用函数只是把名字放在没有括号的地方:test(...,result,serie);我是对的吗?

如果我只想更改函数内的数组,如变量a

,该怎么办?

3 个答案:

答案 0 :(得分:1)

数组总是在C中通过引用传递,因此将一个int数组的地址传递给一个函数(例如&result中的main)就像传递一个双指针(int** )。您尝试此操作时收到的错误是输入错误。

  

如果我只想更改函数内的数组,如变量a?

,该怎么办?

我不确定你的意思是什么。你能澄清一下吗?

答案 1 :(得分:1)

你没有括号传递的原因是因为数组的名称默认为第一个条目的地址:


  test(a, &b, result, serie);  
// is the same as  
  test(a,&b, &result[0], &serie[0]);  

要保存原始数组而不进行修改,您必须传递数组的副本而不是其地址。我能想到的最简单的方法是将数组包装在结构中并按值传递该结构。它会将整个数组复制到本地函数中,并允许您在不影响原始函数的情况下使用它。无法通过C中的值(我知道)传递数组。引用只返回数组的第一个条目 - 另一个C语言的怪癖。

答案 2 :(得分:1)

是的,这是正确的。为了修改数组,您需要做的只是声明:

void test(... int result[], int serie[]);

或者这个:

void test(... int *result, int *serie);

以上两者都是等效的。

为什么这是真的是你传入了一个指针,它通过值传递 。这与数组本身不同,后者是通过引用传递(通过指针)。因此指针被复制,如果你试图在不使用*的情况下实际更改结果的值,它将不会持续到函数之外。如果要在不修改原件的情况下修改函数内部的数组,则必须先复制它们,然后再将它们传入之前或之后。