我不能得到这个差异

时间:2014-11-28 09:05:25

标签: c pointers

#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中创建新的内存,那么它不会改变它的值为什么??

3 个答案:

答案 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);

反映了*pddmain()所做的更改。

答案 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,则必须使用指针作为参数。因此,如果要通过调用函数来更改指针,则必须使用指向该指针的指针!