如果要使用此代码,例如:
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);
。您仍然无法将指针更改为指针,因为那是您收到的副本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句