用于指针的类似 Python 的 C 编码



我正在从Python过渡到C,所以我的问题可能看起来很幼稚。我正在阅读有关 Python-C 绑定的教程,其中提到:

在 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语句、数组或任何算术运算符。 如果不使用指针,则无法使用标准库的大量内容。

"按值传递"意味着,除其他事项外,increment中的形式参数jmaini的实际参数是内存中的单独对象,更改一个对另一个绝对没有影响。 调用函数时,i的值将复制到j,但对i的任何更改都不会反映在j中,反之亦然。

我们在C通过使用指针来解决此问题。 我们不是将i的值传递给increment而是传递其地址(按值(,然后使用一元运算符取消引用该地址*运算符。

这是我们必须使用指针的情况之一。 另一种情况是当我们跟踪动态分配的内存时。 指针对于构建容器(列表、树、队列、堆栈等(也很有用(如果不是严格要求(。

将值作为参数传递并返回其更新的值有效,但仅适用于单个参数。 传递多个参数并以struct类型返回其更新的值可以工作,但如果只是为了避免使用指针而这样做,则不是好的样式。 如果函数必须更新参数返回某种状态(例如scanf库函数(,也是不可能的。

同样,使用文件范围变量不会扩展,并且会造成维护难题。 有时这不是错误的答案,但总的来说这不是一个好主意。

因此,假设您需要传递需要修改的大型数组或其他数据结构。如果应用用于递增整数的方式,则每次调用该函数时都会创建该大数组的副本。显然,创建副本对内存不友好,相反,我们将指针传递给函数并在单个数组或其他任何数组上进行更新。

另外,正如另一个答案所提到的,如果您需要更新许多参数,则不可能以您声明的方式返回。

最新更新