指针作为C中的函数参数

she*_*lbc 27 c parameters pointers parameter-passing

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

int num = 5;
int *ptr = #
Run Code Online (Sandbox Code Playgroud)

以下两个功能有什么区别?

void func(int **foo);
void func(int *foo); 
Run Code Online (Sandbox Code Playgroud)

我在哪里调用函数:

func(&ptr); 
Run Code Online (Sandbox Code Playgroud)

我意识到前两者采用指针作为参数指针,而第二种只采用指针.

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

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

atk*_*atk 59

一个合理的经验法则是,你无法准确地改变传递的确切事物,使调用者看到变化.传递指针是一种解决方法.

通过价值: void fcn(int foo)

通过值传递时,您将获得该值的副本.如果更改函数中的值,则无论您的更改如何,调用者仍会看到原始值.

通过指针到值: void fcn(int* foo)

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

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

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

  • 是的,这是关于如何在自动和动态生命周期方面使用指针的一个很好的解释。但我想 OP 想知道的是为什么在这个原因中对待它,而不是如何对待。但无论如何,到目前为止我已经+1了。 (2认同)

dhe*_*ein 8

差别在处理器将处理代码的操作中简单地说.在这两种情况下,价值本身只是一个地址,这是真的.但是,当地址被取消引用时,对于处理器以及编译器来说,在解除引用之后知道它将处理什么是很重要的.


glg*_*lgl 7

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

int num = 5;
int *ptr = #
Run Code Online (Sandbox Code Playgroud)

以下两个函数有什么区别?:

void func(int **foo);
void func(int *foo);
Run Code Online (Sandbox Code Playgroud)

第一个想要一个指向int的指针,第二个想要一个直接指向int的指针.

我在哪里调用函数:

func(&ptr);
Run Code Online (Sandbox Code Playgroud)

作为ptr指向int的指针,&ptr是一个与a兼容的地址int **.

采取int *意志的功能会有所不同int **.会话的结果将完全不同,导致未定义的行为,可能导致崩溃.

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

               +++++++++++++++++++
adr1 (ptr):    +  adr2           +
               +++++++++++++++++++

               +++++++++++++++++++
adr2 (num):    +  42             +
               +++++++++++++++++++
Run Code Online (Sandbox Code Playgroud)

在adr2,我们有一个int值,42.

在adr1,我们有地址adr2,具有指针的大小.

&ptr给我们adr1,ptr保存值为&numadr2.

如果我adr1用作一个int *,adr2将被误认为是一个整数,导致一个(可能是相当大的)数字.

如果我使用adr2为int **,首先取消引用导致了42,这将是错误解释为地址,并且可能使程序崩溃.

它不仅仅是光学要有之间的差异int *和int **.

我相信后者会给出不兼容的警告,

......有意义......

但只要你知道自己在做什么,似乎细节无关紧要.

你呢?

似乎可能为了可读性和理解,前者是更好的选择(2星指针),但从逻辑的角度来看,有什么区别?

这取决于函数对指针的作用.