Вывести связанный запрос для замены строк - PullRequest
0 голосов
/ 16 октября 2019

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

#include <stdio.h>

void func(char *p, char **q)
{
    char *temp = p;
    p = q;
    q = temp;
}

int main()
{
    char *p ="hello";
    char *q ="world";
    func(p,&q);
    printf("%s, %s", p, q);
    return 0;
}

1 Ответ

2 голосов
/ 16 октября 2019

Вы пытаетесь передать по ссылке, чтобы поменять строки, и используете для этого указатели - это правильный способ сделать это! Однако, поскольку это строка в C, ваши фактические переменные - это указатели . Эти адреса указателя передаются (и меняются) по значению. Действительно, если вы поместите функцию печати внутри func, вы увидите, что строки печатаются в том порядке, который вы ожидаете.

void func(char *p, char *q)
{
    char *temp = p;
    p = q;
    q = temp;
    printf("%s, %s", p, q);
}

int main()
{
    char *p ="hello";
    char *q ="world";
    func(p,q);
    printf("%s, %s", p, q);
    return 0;
}

world, hellohello, world

ЕслиВы хотите поменять местами две переменные, вам нужно только передать их указатели и поменять их местами, но если вы хотите поменять местами сами указатели , , вам нужно передать ссылки на указатели.

#include <stdio.h>

void func(char **p, char **q)
{
    char *temp = *p;
    *p = *q;
    *q = temp;
}

int main()
{
    char *p ="hello";
    char *q ="world";
    func(&p,&q);
    printf("%s, %s", p, q);
    return 0;
}

world, hello

Демо

...