它们可能看起来相同,但实际上并不相同!即使两者都用于pass-by-value
传递参数,但它们的使用方式却大不相同。当您将指针作为参数传递给函数时,无论您通过取消引用该函数体中的这些指针来执行什么操作反映在这些指针指向的变量的原始值中,即使这些passed pointers
可能是在 中声明的“原始”指针的副本。您会main()
看到,多个指针可以指向一个变量,因此变量的值可以是通过取消引用这些指针中的任何一个来更改。
但是,当您将变量作为参数而不是指针传递时,对这些变量值的所有操作都不会反映在“原始”变量的值中。这些更改仅限于copies
作为参数传递的那些更改。
在您的示例中,如果您希望将 ofreturn of foo()
或 of的值分配给doSomething()
除bar
且不打算更改bar
' 的值之外的变量,那么只需要将变量作为参数传递,而不是指针。
这是一些说明它的简单代码:
//Passing variables as arguments
#include<stdio.h>
int foo(int bar){
bar=303;
}
int main(void)
{
int foobar = 0;
printf("The value of foobar before function call is %d\n",foobar);
foo(foobar);
printf("TThe value of foobar after function call is %d",foobar);
}
输出:The value of foobar before function call is 0
`The value of foobar after function call is 303`
//Passing pointers to variables as arguments
#include<stdio.h>
int doSomething();
int foo(int *bar){
*bar = doSomething();
}
int main(void){
int foobar = 0;
printf("The value of foobar before function call is %d\n",foobar);
foo(&foobar);
printf("TThe value of foobar after function call is %d",foobar);
}
int doSomething()
{
return 303;
}
输出:The value of foobar before function call is 0
`The value of foobar after function call is 0`
最后,关于指针使代码变得复杂,好吧,指针是 C 语言最优雅的特性之一,一旦你知道如何使用它们,它就是一个非常有用且不可或缺的工具。