#include<stdio.h>
typedef struct data
{
int a;
int b;
}dd;
dd *changed(dd **d);
dd changep(dd *d);
int main()
{
dd *d=(dd *)malloc(sizeof(*d));
d->a=5;
d->b=6;
changep(d);
printf("after entering into the functin %d\n",d->a);
changed(&d);
printf("%d\n",d->a);
}
dd changep(dd *d)
{
//d=(dd *)malloc(sizeof(*d));
d->a=14;
printf("%d\n",d->a);
}
dd *changed( dd **d)
{
*d=(dd *)malloc(sizeof(*d));
(*d)->a=3;
(*d)->b=4;
}
这里改变了,而且changep正在改变结构中的值为什么2使用双指针然后? 如果我在changep中创建新的内存,那么它不会改变它的值为什么??
答案 0 :(得分:1)
C在函数参数传递中使用pass by value
。
void changep(dd *pd) //notice the change
{
//d=malloc(sizeof(*d)); //do not cast
pd->a=14;
printf("%d\n",pd->a);
}
,它被称为
changep(d);
此处,pd
是函数changep
的本地副本,即d
的本地副本。对pd
的任何内容都不会反映给调用者函数。
要让更改回到来电者[main()
],您需要double pointer
。这就是为什么
void changed( dd ** pd)
{
if (pd)
{
if (! *pd)
*pd=malloc(sizeof(*d)); //do not cast
(*pd)->a=3;
(*pd)->b=4;
}
}
和调用
changed(&d);
反映了*pd
中d
对main()
所做的更改。
答案 1 :(得分:0)
您的两个函数都会更改struct成员的值。你的困惑是为什么单指针或双指针?和什么时候使用哪一个?它们实际上是相同的,但有一些微妙的考虑。在两者中都传递一个指针(一个引用),因此该函数将接收一个地址作为参数,并且可以修改存储在该存储器地址中的值,以便更改在函数外部可见main
首先,当将单个指针传递给结构(或其他任何东西)时,意图通常(并非总是),但通常是对该指针和内存位置进行操作,以便调用者在不需要返回的情况下接收新值。在这种一般情况下,通常不需要返回任何内容,函数可以正确地为void
类型,并且不返回任何值。
第二种情况是,您需要该函数能够以某种方式更改数据结构的地址,例如删除链接列表中的第一个或最后一个节点时。在这种情况下,函数需要访问指针的地址(而不仅仅是指针指向的内存地址)才能使节点发生变化。
在这里,您通常会想到将指针作为双指针传递,因此如果新的列表节点取而代之,指针指向的值不仅会发生变化,而且指针本身的地址也可能会发生变化。更改。当需要传递双指针时,这是少数区域之一 - 当您需要更改指针本身的地址时。由于您需要将此指针返回给调用者,因此这些函数通常是struct pointer type
,因此在列表地址完成所有更改后,您可以将新地址返回到列表的开头(或者其他)给来电者。因此,这些类型函数被声明为struct name*
以满足要求。
注意但是,你仍然可以操作提供给函数的指针的值而不提供返回,但是如果你确实需要更改提供的struct的地址,那么双指针是必需的。
你的代码适用于两者,对于你的双指针功能,没有必要返回。但main
中的值反映了新值:
#include <stdio.h>
#include <stdlib.h>
typedef struct data {
int a;
int b;
} dd;
dd *changed (dd ** d);
void changep (dd * d);
int main () {
dd *d = malloc (sizeof (*d));
d->a = 5;
d->b = 6;
changep (d);
printf ("after entering into the functin %d\n", d->a);
changed (&d);
printf ("%d\n", d->a);
return 0;
}
void changep (dd * d)
{
//d=(dd *)malloc(sizeof(*d));
d->a = 14;
printf ("%d\n", d->a);
}
dd *changed (dd ** d)
{
// *d = (dd *) malloc (sizeof (*d));
(*d)->a = 3;
(*d)->b = 4;
return *d;
}
<强>输出:强>
$./bin/spassvr
14
after entering into the functin 14
3
答案 2 :(得分:0)
这是使用参数参数的值参数和函数的功能差异。 如果要通过调用函数来更改指针指向的var,则必须使用指针作为参数。因此,如果要通过调用函数来更改指针,则必须使用指向该指针的指针!