+ -
当前位置:首页 → 问答吧 → 小声问:这个指针为什么改变不了啊?

小声问:这个指针为什么改变不了啊?

时间:2010-08-17

来源:互联网

#include <stdio.h>
#include <stdlib.h>

deleteint(int *n)
{
    free(n);
    n = NULL;
}

int main()
{
    int *intpt = (int *)malloc( sizeof(int));

    *intpt = 5;

    deleteint(intpt);

}

在main()中intpt:0x009e29b8,我在deleteint()中改为NULL,可回到main()后怎么还是:0x009e29b8?

作者: liklstar   发布时间: 2010-08-17

因为n没有传出来,要的话改用 int **n

作者: hellioncu   发布时间: 2010-08-17



QUOTE:
因为n没有传出来,要的话改用 int **n
hellioncu 发表于 2010-08-17 17:11




    可是在一个过程中断链、接链不是都可以吗?为什么那就可以而这个n却传不出来呢?

作者: liklstar   发布时间: 2010-08-17

回复 hellioncu


    什么样的指针操作在过程中可以带出来,而什么样的不能啊?

作者: liklstar   发布时间: 2010-08-17



QUOTE:
可是在一个过程中断链、接链不是都可以吗?为什么那就可以而这个n却传不出来呢?
liklstar 发表于 2010-08-17 17:13




    那本讲指针的书看看吧,总比我说的强

作者: hellioncu   发布时间: 2010-08-17

如果你想改变intpt,你必须传入intpt的地址

作者: efolzl   发布时间: 2010-08-17

先搞清楚局部变量生存周期.

作者: samlumengjun   发布时间: 2010-08-17

要在传参中改变变量的值,需要使用变量的指针。
同理要在传参中改变指针的值,需要使用指针的指针
不过你这里可以把NULL return回来赋值给需要free的变量。

作者: davelv   发布时间: 2010-08-17

回复 efolzl


    #include <stdio.h>
#include <stdlib.h>

struct intLink {
        int id;
        struct intlink *next;
} *intlink=NULL;

deleteint(int *n)
{
    free(n);
    n = NULL;
}

deletelink(struct intLink *link)
{
        struct intLink *node;

        node = link;
        node = node->next;
        link->next = node->next;
        free(node);

}

main()
{
    int *intpt = (int *)malloc( sizeof(int));
        struct intLink *p;

    *intpt = 5;

    deleteint(intpt);

    intlink = (struct intLink *)malloc(sizeof(struct intLink));
        p = intlink;
        p->id = 1;
        p->next = (struct intLink *)malloc(sizeof(struct intLink));
        p = p->next;
        p->id = 2;
        p->next = (struct intLink *)malloc(sizeof(struct intLink));
        p = p->next;
        p->id = 3;
        p->next = NULL;

        deletelink(intlink);
        p = intlink;
        while (p != NULL) {
                printf("\nndoe[%d] is exists", p->id);
            p = p->next;
    }
}

断链能成功,是不是因为我给的是next变量的地址啊?为什么对next操作能成功呢?而要改变intpt的值(地址)就要给intpt的地址?

作者: liklstar   发布时间: 2010-08-17

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. deleteint(int **n)
  4. {
  5.     free(*n);
  6.     *n = NULL;
  7. }

  8. int main()
  9. {
  10.     int *intpt = (int *)malloc( sizeof(int));

  11.     *intpt = 5;

  12.     deleteint(&intpt);

  13. }
复制代码
呵呵。老问题。所有的函数传参都会复制一份实参。所以要在函数里改变实参,是不可能的,想要解决你这个问题就必须传进实参的地圵,函数里将会复制一分实参的地址,这样在函数里改变实参地址的指向。就可以在函数中改变了实参。

作者: zhangsuozhu   发布时间: 2010-08-17

想要改变普通变量,就要传递指向它的指针;
想要改变指针变量?一样啊,也要传递指向指针的指针,不一定是二级指针,理论上更多层次的指向应该也是可以的

作者: liwangli1983   发布时间: 2010-08-17