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

#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 также должен измениться на "Плохо".

1
Atharv Khadtare 23 Окт 2018 в 15:37

2 ответа

Лучший ответ

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

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

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

str2 = "Bad"

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

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

*str2 = "Bad"

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

0
lds 23 Окт 2018 в 12:54

После казни

str2 = "Bad";         

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

1
William Pursell 23 Окт 2018 в 12:42