如果我有这样的代码,例如:
int num = 5;
int *ptr = #
下面两个函数的区别是什么?
void func(int **foo);
void func(int *foo);
在我调用函数的地方:
func(&ptr);
我意识到前一种方法将指向指针的指针作为参数,而第二种方法只使用指针。
如果我传入func(&ptr)
,我实际上就是在传入一个指针。指针指向另一个指针有什么区别?
我相信后者会给出不兼容的警告,但看起来细节并不重要,只要你知道你在做什么。似乎为了可读性和理解前者是一个更好的选择(2星指针),但从逻辑的角度来看,区别是什么?
发布于 2013-09-09 20:37:24
不同之处很简单,就是处理器将处理代码的操作。在这两种情况下,值本身都只是一个地址,这是真的。但是,当地址被解除引用时,对于处理器和编译器来说,知道在解除引用之后它将处理什么是很重要的。
发布于 2013-09-09 20:44:13
通常,这种差异表明函数将赋值给指针,并且这种赋值不应该仅仅是函数的局部赋值。例如(请记住,这些示例的目的是为了检查foo的性质,而不是完整的函数,而不是你原始帖子中的代码应该是真正的工作代码):
void func1 (int *foo) {
foo = malloc (sizeof (int));
}
int a = 5;
func1 (&a);
类似于
void func2 (int foo) {
foo = 12;
}
int b = 5;
func2 (b);
在这个意义上,foo
在func2()中可能等于12,但是当func2()返回时,b
仍然等于5。在func1()中,foo
指向一个新的整数,但是当a
()返回时,func1仍然是a
。
如果我们想要更改a
或b
的值,该怎么办?WRT b
,一个正常的整数:
void func3 (int *foo) {
*foo = 12;
}
int b = 5;
func2 (&b);
将会工作--请注意,我们需要一个指向int的指针。若要更改指针中的值(即。它所指向的int的地址,而不仅仅是它所指向的int中的值):
void func4 (int **foo) {
*foo = malloc (sizeof (int));
}
int *a;
foo (&a);
'a‘现在指向由func4()中的malloc返回的内存。地址&a
是a
的地址,它是一个指向int的指针。int指针包含int的地址。func4()
接受一个整型指针的地址,以便它可以将一个整型指针的地址放入该地址,就像func3()获得一个整型指针的地址,以便可以将一个新的int值放入其中一样。
这就是如何使用不同的参数样式。
发布于 2018-03-25 19:00:27
问这个问题已经有一段时间了,但这是我对这个问题的看法。我现在正在尝试学习C语言,而指针是无休止的令人困惑的…因此,我利用这段时间来澄清指针上的指针,至少对我来说是这样。以下是我对此的看法。
我举了here的一个例子
#include <stdlib.h>
#include <string.h>
int allocstr(int len, char **retptr)
{
char *p = malloc(len + 1); /* +1 for \0 */
if(p == NULL)
return 0;
*retptr = p;
return 1;
}
int main()
{
char *string = "Hello, world!";
char *copystr;
if(allocstr(strlen(string), ©str))
strcpy(copystr, string);
else fprintf(stderr, "out of memory\n");
return 0;
}
我想知道为什么allocstr需要双指针。如果它是一个指针,它意味着你可以传递它,它将在返回后被改变……
如果你做这个例子,它工作得很好。但是,如果您将分配字符串更改为只有*指针而不是**指针(并且在main中使用copystr而不是©str ),则会得到segmentation fault。为什么?我在代码中放了一些printfs,它工作得很好,直到使用strcpy行。所以我猜它没有为copystr分配内存。再问一次,为什么?
让我们回到指针传递的含义。这意味着你可以传递内存位置,你可以直接在那里写你想要的值。您可以修改该值,因为您可以访问该值的内存位置。
类似地,当您将指针传递给指针时,您将传递指针的内存位置,换句话说,就是内存位置的内存位置。现在(指向指针的指针)您可以更改内存位置,因为您可以在仅使用指针时更改该值。
代码工作的原因是您传递了内存位置的地址。函数allocstr会更改该内存位置的大小,以便它可以保存"Hello world!“并返回指向该内存位置的指针。
它实际上和传递一个指针是一样的,但是我们有一个内存位置,而不是一个值。
https://stackoverflow.com/questions/18698317
复制相似问题