C 结构示例*e:函数(&;e)和函数(e)之间的差异

C 结构示例*e:函数(&;e)和函数(e)之间的差异,c,function,struct,C,Function,Struct,如果我有一个结构示例*e,那么函数(&e)和函数(e)之间有什么区别 举个例子 这是第一个代码: #include <stdio.h> struct example { int x; int y; }; void function (struct example **); int main () { struct example *e; function (&e); return 0; } void function (st

如果我有一个
结构示例*e
,那么
函数(&e)
函数(e)
之间有什么区别

举个例子

这是第一个代码:

#include <stdio.h>

struct example
{
    int x;
    int y;
};

void function (struct example **);

int main ()
{
    struct example *e;

    function (&e);

    return 0;
}

void function (struct example **e)
{
    / * ... */
}
#包括
结构示例
{
int x;
int-y;
};
void函数(结构示例**);
int main()
{
结构示例*e;
功能(e&e);
返回0;
}
void函数(结构示例**e)
{
/ * ... */
}
这是第二个代码:

#include <stdio.h>

struct example
{
    int x;
    int y;
};

void function (struct example *);

int main ()
{
    struct example *e;

    function (e);

    return 0;
}

void function (struct example *e)
{
    / * ... */
}
#包括
结构示例
{
int x;
int-y;
};
void函数(结构示例*);
int main()
{
结构示例*e;
职能(e);
返回0;
}
void函数(结构示例*e)
{
/ * ... */
}
这两种代码之间有什么区别?
谢谢大家!

在第一个中,传递指向结构的指针地址。在第二个中,传递结构的地址

在这两种情况下,
函数
都可以更改传递它的结构:

(*e)->x = 10; // First, needs additional dereferencing *.

e->x    = 10; // Second.
在第一种情况下,您还可以给
main()
e
一个不同的值,例如将另一个结构的地址分配给它,或者将它设置为
NULL

*e = NULL;
您实际上忘记了第三个案例:

function(struct example e) { ... }

在这里,函数将获得传递给它的结构副本。

第一个示例可以更改“e”本身(f.e.Malloc()它并返回它)。
这两个示例都可以更改“e”的内容,如果它是malloced。

该结构位于“云”中的某个位置。您正在处理指向它的指针,这些指针是保存结构的地址的简单变量。在第一个示例中,您可以更改
指针
结构
。在第二个示例中,您只能更改结构,但只能更改指向它的指针(本地副本)

当您在第二个示例中执行一个
e=malloc…
,然后
该结构继续存在于“云”中,但您创建了一个新的结构,当
功能完成(=内存泄漏)时,该结构将失去任何连接。从
main
的角度来看,一切都保持不变


<>在C++中,你可以改变你的第二个例子,比如“代码>空虚函数(Struts示例*&E)< /Cord>”,它的行为与第一个相同,但在“指针指针”E的自动解译的舒适性(引用是某种自动引用指针).

但是在第二种情况下,我可以在函数中执行
e=malloc(2*sizeof(struct示例))
吗?@user您可以,但您只能在函数中本地更改
e
。函数参数
e
是按值传递的。好的,在第一个参数中,如果我执行
*e=malloc(2*sizeof(struct example))
我也在
main()
中更改它,对吗?@user确实,使用
*e
你基本上是在访问
main()
e
@意思很重要。在这两种情况下,函数都可以更改传递它的结构,但在第二种情况下,为什么我要修改结构?@Peter Miehle。您的意思是在第一个代码中我可以在函数中使用malloc,例如
*e=malloc(2*sizeof(struct-example))在第二种情况下不是吗?