указатель структуры передается функции - PullRequest
0 голосов
/ 09 июля 2019

У меня проблемы с пониманием указателей, передаваемых в функцию.Здесь есть указатель структуры, который передается функции, и указатель увеличивается на некоторое значение, и он не отражается в переменной указателя.Я думаю, это вызов по значению, но как?Не могли бы вы объяснить?

#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 ]

1 голос
/ 09 июля 2019

Объявление

node x = { 100 };

выделяет память для структуры узла и инициализирует ее.Оператор

change_addr(&x);

берет адрес памяти этой структуры, который является просто числом, скажем, 1000, и передает его по значению в функцию change_addr ().Внутри этой функции вы добавляете 100 к вашей локальной копии указателя с именем ptr, что указывает на область памяти далеко за пределами места, где расположен x (если x был массивом, а неединственная структура, это будет указывать на 101-й элемент).Затем вы возвращаетесь, который отбрасывает вашу локальную копию адреса и возвращается к исходному кадру стека, где x никогда не изменялся.

Внутри функции change_addr () вы могли бы изменить содержимое структуры, получив к ней доступ через указатель.Например, ptr->data = 200 изменил бы свои данные.Но если по какой-то причине вы хотите изменить сам адрес указателя, вам придется создать указатель на указатель и передать его функции, принимающей соответствующий тип аргумента.

1 голос
/ 09 июля 2019

Вы передаете адрес структуры в функцию. Этот аргумент увеличивается внутри функции и недоступен извне. Похоже на то, что произошло бы, если вы передадите целое число и увеличите его внутри функции. Если вы хотите увеличить data, вам нужно получить к нему доступ через указатель, переданный в функцию. Например, node->data = 0;, что эквивалентно (*node).data = 0;.

&node - это адрес структуры узла. Этот параметр помещается в стек вызовов перед записью адреса возврата и переходом к функции. См. Это объяснение C соглашения о вызовах . change_addr() теперь может читать и записывать это значение, даже не увидев main() значение, поскольку оно извлекается из стека после завершения выполнения change_addr().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...