指针作为C中的参数

时间:2016-06-24 17:06:00

标签: c pointers parameters

假设有一个指针作为参数,为什么它的值在函数和函数之后仍未被修改,我必须使用这种语法:

void function_name (int **p)
{
// code
}

并在main()中:

int *v;

function name (&v);

我想指定我使用指向结构类型的指针作为参数。

2 个答案:

答案 0 :(得分:3)

C按值传递参数。如果要修改函数中的某些内容并使修改在调用函数中生效,则必须传递指向调用函数中变量的指针。否则,对函数中的变量所做的任何更改都只是局部更改,并且不会影响调用函数中变量的值。

让我们从int类型变量开始。

void foo(int x)
{
   x = 10;
}

int main()
{
   int a = 100;
   foo(a);  // Value of a does not change in this function
}

在上述计划中,a的值100仍为main。这条线

x = 10;
foo中的

仅影响foo中变量的值。要使foo中的更改影响main中的值,您需要将指针传递给a

void foo(int* x)
{
   *x = 10;
}

int main()
{
   int a = 100;
   foo(&a);  // Value of a changes in this function
}

将这个比喻用于指针。

void bar(int* x)
{
   x = malloc(10*sizeof(int));
}

int main()
{
   int* ptr = NULL;
   bar(ptr);  // Value of ptr does not change in this function
}

bar10 int的数组分配内存,并将内存分配给x,但该更改是本地的。 main没有看到它。在main中,ptr仍为NULL。要在bar影响ptr进行更改,必须将指向ptr的指针传递给bar

void bar(int** x)
{
   *x = malloc(10*sizeof(int));
}

int main()
{
   int* ptr = NULL;
   bar(&ptr);  // Value of ptr changes in this function
}

答案 1 :(得分:0)

在C中,参数按值传递。这意味着当您将参数传递给函数时,会生成该变量的副本。例如

int main()
{
    int x = 6;
    repchar(x, 'r');

    printf("%d\n", x);
    return 0;
}
void repchar(int n, char c)
{
    while (--n >= 0)
        putchar(c);
}

此程序打印字母r六次,然后在最后printf打印出6,而不是-1。原因是当调用repchar时,x被复制了。这样,当repchar递减n时,来电者的副本不会更改。

但是,如果我们传递了指针,则会修改n

int main()
{
    int x = 6;
    repchar(&x, 'r');

    printf("%d\n", x);
    return 0;
}
void repchar(int *n, char c)
{
    while (--(*n) >= 0)
        putchar(c);
}

现在正在复制变量的地址,而不是复制变量。在repchar内部,*n正在倒计时。这将访问n引用的值,该值与x的地址相同并递减。结果,最后一个printf将给出-1。