gpt4 book ai didi

c - 指针作为 C 中的函数参数

转载 作者:太空狗 更新时间:2023-10-29 16:23:33 24 4
gpt4 key购买 nike

如果我有这段代码,例如:

int num = 5;
int *ptr = #

下面两个函数有什么区别?

void func(int **foo);
void func(int *foo);

调用函数的地方:

func(&ptr); 

我意识到,两者前者以一个指向指针的指针作为参数,而第二个只接受一个指针。

如果我传入 func(&ptr),我实际上是在传入一个指针。指针指向另一个指针有什么区别?

我相信后者会发出不兼容警告,但只要你知道自己在做什么,细节似乎并不重要。似乎为了可读性和理解,前者是更好的选择(2星指针),但从逻辑的角度来看,有什么区别?

最佳答案

一个合理的经验法则是,您不能准确地更改传递的确切内容,以便调用者看到更改。传递指针是解决方法。

按值传递:void fcn(int foo)

按值传递时,您会得到该值的副本。如果您更改函数中的值,无论您如何更改,调用者仍会看到原始值。

通过指向值的指针传递:void fcn(int* foo)

通过指针传递给你一个指针的副本——它指向与原始指针相同的内存位置。此内存位置是存储原始文件的位置。这使您可以更改指向的值。但是,您无法更改指向数据的实际指针,因为您只收到了指针的副本。

将指针传递给指向值的指针:void fcn(int** foo)

您可以通过将指针传递给指向值的指针来绕过上述问题。如上所述,您可以更改该值,以便调用者看到更改,因为它与调用者代码使用的内存位置相同。出于同样的原因,您可以更改指向该值的指针。这使您可以执行诸如在函数内分配内存并返回它之类的事情; &arg2 = calloc(len);。您仍然无法将指针更改为指针,因为这是您收到的副本。

关于c - 指针作为 C 中的函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18698317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com