传递给函数的struct指针

时间:2019-07-09 19:04:07

标签: c function pointers

我很难理解传递给函数的指针。这里有一个struct指针,该指针被传递给函数,并且该指针会增加一些值,并且不会反映在指针变量中。我猜这是按值调用,但是如何?你能解释一下吗?

#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;
}

2 个答案:

答案 0 :(得分:1)

您将结构的地址传递给函数。此参数在函数内递增,并且不能从外部访问。类似于如果在函数中传递和整数并将其递增,将会发生的情况。如果要递增data,则需要通过传递给函数的指针进行访问。例如node->data = 0;等效于(*node).data = 0;

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

答案 1 :(得分:1)

声明

node x = { 100 };

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

change_addr(&x);

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

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