假设有一个指针作为参数,为什么它的值在函数和函数之后仍未被修改,我必须使用这种语法:
void function_name (int **p)
{
// code
}
并在main()中:
int *v;
function name (&v);
我想指定我使用指向结构类型的指针作为参数。
答案 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
}
bar
为10
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。