函数中的 C 指针赋值

Posted

技术标签:

【中文标题】函数中的 C 指针赋值【英文标题】:C Pointer Assignment in a function 【发布时间】:2013-01-23 11:54:41 【问题描述】:

为什么我不能在函数中分配一个点。正如您在以下代码中注意到的那样。函数返回后,我无法分配指向正确地址的指针 p1。但是使用全局指针*p,我可以存储地址信息。

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

int *p = NULL;
void test(int * pt1, int**pt2)
    p = (int*)malloc(sizeof(int));    
    pt1 = p;
    *pt2 = p;
    printf("p points to %p\n", p);
    printf("pt1 points to %p\n", pt1);
    printf("pt2 points to %p\n", *pt2);


int main(void) 
    int *p1 = NULL; 
    int *p2 = NULL;

    printf("p points to %p\n", p);
    printf("p1 points to %p\n", p1);
    printf("p2 points to %p\n", p2);

    test(p1, &p2);

    printf("p points to %p\n", p);
    printf("p1 points to %p\n", p1);
    printf("p2 points to %p\n", p2);

    return 0;

输出:

p points to (nil)
p1 points to (nil)
p2 points to (nil)
p points to 0x8acb008
pt1 points to 0x8acb008
pt2 points to 0x8acb008
p points to 0x8acb008
p1 points to (nil)
p2 points to 0x8acb008

【问题讨论】:

在 C 中,一切都是按值传递的。指针也不例外。 【参考方案1】:

test 内部,变量pt1 本身就是一个离散指针。也就是说,它只是p1 的别名,而是仅在调用期间存在的副本。

因此,您对其所做的任何分配都只会在该调用期间退出,并且不会传播到外部。当您从 test 返回时,指针 pt1 将不复存在,并且不会将任何更改复制回来。

除了像使用 pt2 那样使用额外的“层”指针外,有时还适合使用返回值与更广泛的受众“分享”更改:

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

int *p = NULL;
int *test(int * pt1, int**pt2)
    p = (int*)malloc(sizeof(int));    
    pt1 = p;
    *pt2 = p;
    printf("p points to %p\n", p);
    printf("pt1 points to %p\n", pt1);
    printf("pt2 points to %p\n", *pt2);
    return pt1;


int main(void) 
    int *p1 = NULL; 
    int *p2 = NULL;

    printf("p points to %p\n", p);
    printf("p1 points to %p\n", p1);
    printf("p2 points to %p\n", p2);

    p1=test(p1, &p2);

    printf("p points to %p\n", p);
    printf("p1 points to %p\n", p1);
    printf("p2 points to %p\n", p2);

    return 0;

【讨论】:

非常感谢。我现在明白了。【参考方案2】:

您通过值传递p1,因此它不会在main 函数中更新。但是,您通过引用传递了p2(注意您写的是&amp;p2),因此可以更改它。

【讨论】:

糟糕,看起来 75 英寸的钢琴家打败了我!【参考方案3】:

您通过值传递 p1,因此更改仅在该函数的范围内可见。传递一个指向该指针的指针,就像你对 p2 所做的那样,你很好。

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

int *p = NULL;
void test(int **pt1, int**pt2)
    p = (int*)malloc(sizeof(int));    
    *pt1 = p;
    *pt2 = p;
    printf("p points to %p\n", p);
    printf("pt1 points to %p\n", pt1);
    printf("pt2 points to %p\n", *pt2);


int main(void) 
    int *p1 = NULL; 
    int *p2 = NULL;

    printf("p points to %p\n", p);
    printf("p1 points to %p\n", p1);
    printf("p2 points to %p\n", p2);

    test(&p1, &p2);

    printf("p points to %p\n", p);
    printf("p1 points to %p\n", p1);
    printf("p2 points to %p\n", p2);

    return 0;

【讨论】:

以上是关于函数中的 C 指针赋值的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中能否直接给指针指向的数据赋值?为啥?

C 语言指针间接赋值 ( 指针作为 函数参数 的意义 | 间接赋值 代码示例 )

C 语言多级指针 ( 在函数中生成 二级指针 | 通过传入的 三级指针 进行间接赋值 )

c语言如何给结构体指针赋值?

C语言指针变量的赋值和做函数的参数

c语言如何给指针参数赋值为null?