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))代码>在第二种情况下不是吗?