Указатель C не устанавливается равным другому - PullRequest
0 голосов
/ 09 мая 2019
    void s(int* a, int* b) {
        a=b;
    }
    int main(int argc, char* argv[]) {
        int* a = malloc(sizeof(int));
        int* b = malloc(sizeof(int));
        int c = 10;
        int d = 5
        a = &c;
        b = &d;
        printf("%d %d\n",*a,*b);
        s(a,b);
        printf("%d %d\n",*a,*b);
    }

Я очень растерялся.Это очень простой код.Я думал, что это приведет к тому, что a и b будут указывать на одно и то же значение.Когда я делаю a = b внутри основной функции, все работает как положено.Когда я использую GDB, это даже показывает, что они указывают на одно и то же место в памяти, и функция не оптимизируется !!!Так что же происходит?Функция создает свою собственную локальную копию?Почему они не указывают на одну и ту же переменную, помогите.

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Вы хотите изменить значения указателей.Указатели передаются по значению, поэтому вам нужен указатель на указатель, чтобы изменить его значение:

#include <stdio.h>

void s(int** foo, int** bar)
{
    *foo = *bar;
}

int main(void)
{
    int c = 10;
    int d = 5;

    int *a = &c;
    int *b = &d;

    printf("%d %d\n", *a, *b);  // 10 5

    s(&a, &b);

    printf("%d %d\n", *a, *b);  // 5 5     a points at d as well
}

В вашей версии вы изменили только те параметры, которые являются копиями значений, переданных в функцию.

Чтобы помочь вам лучше понять, рассмотрим следующее:

#include <stdio.h>

void value(int foo, int bar)
{
    foo = bar;  // changing local copies
}

void pointer(int *foo, int *bar)
{
    *foo = *bar;  // changing the value foo points to to the value bar points to
}

int main(void)
{
    int a = 5;
    int b = 7;

    value(a, b);
    printf("%d, %d\n", a, b);  // 5, 7

    pointer(&a, &b);
    printf("%d, %d\n", a, b);  // 7, 7
}

Мы сделали это с типом int.Теперь давайте просто заменим int на int*:

#include <stdio.h>

void value(int *foo, int *bar)
{
    foo = bar;  // changing local copies
}

void pointer(int **foo, int **bar)
{
    *foo = *bar;  // changing the value foo points to to the value bar points to
}

int main(void)
{
    int x = 5;
    int y = 7;

    int *a = &x;
    int *b = &y;

    value(a, b);
    printf("%d, %d\n", *a, *b);  // 5, 7

    pointer(&a, &b);
    printf("%d, %d\n", *a, *b);  // 7, 7  now both point at y
}

Итак, вы видите, это одна и та же концепция оба раза.В первом примере указанными значениями являются int с, а их значения являются числами, во втором примере указанными значениями являются int* с, а их значения являются значениями указателя ( <~ </em> стандартная терминология,"адрес").Но механизм тот же

0 голосов
/ 09 мая 2019

Вы программируете почти правильно, но вам нужно передать адрес переменных в функции, поскольку вы используете вызов по ссылке и в функции берете указатель на указатели.

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