Почему значение указателя все еще 20? - PullRequest
2 голосов
/ 26 марта 2019
void func(char *p)
{
    int q = 13;
    p = &q;
    printf("%d\n", *p);
}

void main(void)
{
    int var = 20;
    int *p = &var;

    printf("%d\n", *p);

    func(p);

    printf("%d\n", *p);
}

Почему при выходе из функции указатель все еще равен 20? Я прыгал, когда func() заканчивается, указатель изменяется в нем, в последнем printf() значение *p будет указывать на некоторые случайные вещи из стека.

Ответы [ 2 ]

6 голосов
/ 26 марта 2019

То, что у вас было, это

void func(char *p)
{
    int q = 13;
    p = &q;
}

Это означает «сделать p точкой для q» и изменить значение p, которое является просто переменной внутри функции.Изменения значений переменных не отражаются вне функции.

Если бы вы написали это

void func(char *p)
{
    int q = 13;
    *p = q;
}

Это означало бы "сделать переменную, на которую указывает p, изменить ее значение на 13"и это будет видно снаружи, это означает, что переменная var в main изменит свое значение (зависит от того, каким будет порядок байтов, поскольку это int, а не char, как утверждает указатель).

ЕслиВы хотите изменить значение указателя в main, вам нужен двойной указатель:

void func(char **p)
{
    int q = 13;
    *p = &q;
    printf("%d\n", *p);
}

Это будет означать «создать указатель, на который p указывает, чтобы указать на локальную переменную q», и в этомВ этом случае у вас будет висячий указатель, как и ожидалось в main.

3 голосов
/ 26 марта 2019

Нет, p само передается быть значением.Любые изменения, сделанные в p внутри func(), не будут отражены обратно в main().

Для полноты информации любые изменения, внесенные в значение, указанное в p (то есть, *p) было бы отражено еще в main().

...