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);.您仍然无法更改指针的指针,因为这是您收到的副本.
差别在处理器将处理代码的操作中简单地说.在这两种情况下,价值本身只是一个地址,这是真的.但是,当地址被取消引用时,对于处理器以及编译器来说,在解除引用之后知道它将处理什么是很重要的.
如果我有这个代码,例如:
Run Code Online (Sandbox Code Playgroud)int num = 5; int *ptr = #以下两个函数有什么区别?:
Run Code Online (Sandbox Code Playgroud)void func(int **foo); void func(int *foo);
第一个想要一个指向int的指针,第二个想要一个直接指向int的指针.
我在哪里调用函数:
Run Code Online (Sandbox Code Playgroud)func(&ptr);
作为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星指针),但从逻辑的角度来看,有什么区别?
这取决于函数对指针的作用.