Символьные указатели на C и множественные ссылки на один и тот же адрес - PullRequest
0 голосов
/ 23 октября 2018

Работая с python ранее, у меня возникают проблемы с пониманием указателей на символы.

#include <stdio.h>          // 1
main()                      // 2
{                           // 3
    char *str1 = "Good";    // 4
    char *str2;             // 5
    str2 = str1;            // 6
    printf("1. str1 = %s, str2 = %s\n", str1, str2);   // 7
    str2 = "Bad";                                      // 8
    printf("2. str1 = %s, str2 = %s\n", str1, str2);   // 9
}                                                      // 10

Согласно моему пониманию,
В строке 4: str1 содержит адрес str1 [0] (то есть & str1[0])
В строке 6: строка str2 указывает на & s [0] (поскольку строка str1 содержит & str1 [0])
В строке 8: значение в строке str2 изменяется на «Плохо».
Но, поскольку str2 указывает на & s [0], str1 также должен измениться на «Плохой».

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Указатель - это в основном то, что предполагает его имя.Переменная-указатель, например, только str1 указывает на & st1 [0].

*str1 -> &str1[0]
 str2 = str1

Это заставляет str2 также указывать на & str1 [0].Но он просто указывает на этот адрес памяти.Поэтому, когда вы пишете

str2 = "Bad"

«Плохо» - это строка в памяти, которая имеет свой новый адрес.И вы используете переменную указателя, чтобы указать на это новое место.

Чтобы фактически обновить адрес памяти, на который указывает переменная указателя, вы должны использовать его следующим образом

*str2 = "Bad"

Когда выиспользуйте str2, вы используете переменную.Но когда * str2 вы фактически используете базовый адрес, на который в данный момент указывает переменная str2.

0 голосов
/ 23 октября 2018

После выполнения

str2 = "Bad";         

str2 указывает на другое местоположение.Он больше не ссылается на ту же память, что и str1.Это утверждение не изменяет содержимое памяти, на которое указывает прежнее значение str2.

...