C语言中类似Python的指针编码

问题描述 投票:0回答:3

我正在从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);
}
python c pointers
3个回答
5
投票

您只能从函数返回一件事。如果您需要更新多个参数,或者需要将返回值用于更新后的变量之外的其他内容(例如错误代码),则需要将指针传递给该变量。


1
投票

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

另外,作为另一个答案,如果您需要更新许多参数,则无法以声明的方式返回。


0
投票

首先解决这个问题-指针基本到C编程。编写C时不能完全摆脱指针的困扰。您最好不要使用if语句,数组或任何算术运算符。如果不使用指针,则无法使用标准库的大部分内容。

“按值传递”尤其是表示j中的形式参数incrementi中的实际参数main是内存中的独立对象,更改其中的一个绝对不影响其他。调用该函数时,i的值将复制到j,但是对i的任何更改都不会反映在j中,反之亦然。

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

这是我们have

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

将值作为参数传递并返回其更新的值有效,但仅适用于单个参数。可以传递多个参数并以struct类型返回其更新值,但是可以避免使用指针,如果不是just

,则不是很好的样式。如果该函数必须更新参数and返回某种状态(例如scanf库函数),也是不可能的。

类似地,使用文件作用域变量不会扩展,并且会造成维护难题。有时候,答案不是错误,但总的来说,这不是一个好主意。

© www.soinside.com 2019 - 2024. All rights reserved.