【问题标题】:struct pointer passed to a function结构指针传递给函数
【发布时间】:2019-07-09 19:04:07
【问题描述】:

我无法理解传递给函数的指针。这里有一个结构指针,它被传递给一个函数,并且指针增加了一些值,它不会反映在指针变量中。我想这是按值调用,但如何?能解释一下吗?

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

typedef struct node{
    int data;
}node;

void change_addr(node *ptr){
    ptr += 10;
    printf("Inside Address : %p\n",ptr);
}

int main(){
    node x = {100};
    printf("Address : %p\n",x);
    change_addr(&x);
    printf("Address : %p\n",x);
    return 7;
}

【问题讨论】:

    标签: c function pointers


    【解决方案1】:

    声明

    node x = { 100 };
    

    为节点结构分配内存,并对其进行初始化。声明

    change_addr(&x);
    

    获取该结构的内存地址,例如 1000 之类的数字,然后将其 按值 传递给 change_addr() 函数。在该函数中,您将 100 添加到名为ptr 的指针的本地副本,这使它指向远离x 所在的内存区域(如果x 是一个数组而不是而不是单个结构,它将指向第 101 个元素)。然后您返回,它丢弃您的地址的本地副本,并返回到您的初始堆栈帧,其中 x 从未被修改过。

    在 change_addr() 函数中,您可以通过指针访问结构的 内容 来更改它。例如,ptr-&gt;data = 200 会更改其数据。但是,如果您出于某种原因想要更改指针地址本身,则必须创建指向该指针的指针,并将其传递给采用适当参数类型的函数。

    【讨论】:

      【解决方案2】:

      您将结构的地址传递给函数。此参数在函数内递增,并且无法从外部访问。类似于如果您在函数内传递和整数并递增它会发生什么。如果你想增加data,那么你需要通过传递给函数的指针来访问它。例如node-&gt;data = 0; 等价于(*node).data = 0;。

      &amp;node 是节点结构的地址。此参数在写入返回地址并跳转到函数之前被压入调用堆栈。请参阅C calling convention 的说明。 change_addr() 现在可以在 main() 看到该值的情况下读取和写入该值,因为它在 change_addr() 的执行完成后从堆栈中弹出。

      【讨论】:

        猜你喜欢
        • 2020-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-02
        • 2019-05-03
        • 2021-07-17
        • 2017-10-02
        相关资源
        最近更新 更多