我正在从Python过渡到C,因此我的问题可能看起来很幼稚。我正在阅读有关Python-C绑定的tutorial,并提到:
在C中,所有参数都是传递值。如果要允许函数在调用方中更改变量,则需要将指针传递给该变量。
问题:为什么我们不能简单地在函数内部重新分配值并且没有指针?
以下代码使用指针:
#include <stdio.h>
int i = 24;
int increment(int *j){
(*j)++;
return *j;
}
void main() {
increment(&i);
printf("i = %d", i);
}
现在可以将其替换为不使用指针的以下代码:
int i = 24;
int increment(int j){
j++;
return j;
}
void main() {
i=increment(i);
printf("i = %d", i);
}
您只能从函数返回一件事。如果您需要更新多个参数,或者需要将返回值用于更新后的变量之外的其他内容(例如错误代码),则需要将指针传递给该变量。
因此,假设您需要传递大型数组或其他需要修改的数据结构。如果采用递增整数的方式,则会为该函数的每次调用创建该大型数组的副本。显然,创建副本不是内存友好型的,相反,我们将指针传递给函数并在单个数组或任何数组上进行更新。
另外,作为另一个答案,如果您需要更新许多参数,则无法以声明的方式返回。
首先解决这个问题-指针基本到C编程。编写C时不能完全摆脱指针的困扰。您最好不要使用if
语句,数组或任何算术运算符。如果不使用指针,则无法使用标准库的大部分内容。
“按值传递”尤其是表示j
中的形式参数increment
和i
中的实际参数main
是内存中的独立对象,更改其中的一个绝对不影响其他。调用该函数时,i
的值将复制到j
,但是对i
的任何更改都不会反映在j
中,反之亦然。
我们通过使用指针在C
中解决此问题。而不是将i
的值传递给increment
,我们传递其address(按值),然后使用一元*
运算符取消引用该地址。
这是我们have
使用指针的情况之一。另一种情况是当我们跟踪动态分配的内存时。指针对于构建容器(列表,树,队列,堆栈等)也很有用(如果不是严格要求的话)。将值作为参数传递并返回其更新的值有效,但仅适用于单个参数。可以传递多个参数并以struct
类型返回其更新值,但是可以避免使用指针,如果不是just
scanf
库函数),也是不可能的。类似地,使用文件作用域变量不会扩展,并且会造成维护难题。有时候,答案不是错误,但总的来说,这不是一个好主意。