Имея функцию, измените значение, которое указатель представляет в C
У меня есть функция main
, которая имеет char, я пытаюсь передать указатель на это char
в функцию и изменить ее с A
на B
, но она просто не делает " Кажется, это изменило. Пример, показанный здесь, - это просто текущее состояние кода, в котором я пробовал много разных вариаций, поэтому могут быть другие ошибки там, просто сжимая на соломинках.
int main()
{
char result = 'A';
setChar(&result);
printf("%C", result);
}
void setChar(char* charToChange)
{
charToChange = "B";
}
Ответы
Ответ 1
Вы хотите *charToChange = 'b';
. Указатель charToChange
- это локальная переменная (параметр) в setChar
, но вы можете изменить то, на что она указывает, используя префикс *
и назначение. Обратите внимание, что *charToChange
также является символом, а не строкой.
Ответ 2
Вы должны dereference указатель, переданный в setChar()
, чтобы изменить значение, на которое оно указывает, а не сам указатель.
Вы также должны использовать символьный литерал 'B'
вместо строкового литерала "B"
(который является указателем на char
, а не char
).
void setChar(char* charToChange)
{
*charToChange = 'B';
}
Ответ 3
когда вы вызываете функцию setChar с параметром & result в качестве параметра, он передает адрес результата, где он хранится.
поэтому он присваивается указателю char * charToChange
Скажем, адрес result - [0x00000010] → 'A'
И адрес charToChange - [0x00000100] → 0x00000010
Теперь, когда вы пытаетесь написать charToChange = "B";
Создает новую память, в которой хранится "B"
Пусть Say [0x00001000] → 'B' && & & [0x00001001] → '\ 0'
Итак, делая Assignment, он сохраняет
[0x00000100] → 0x00001000
Но все же адрес 0x00000010 указывает на A
Итак, это неверно
Вы должны заменить charToChange = "B"; на
* charToChange = 'B';
Значит, значение 0x00000100 становится "B"
Всегда помнить
* означает ValueAt и
& Средство AddressOf
Ответ 4
Вы хотите изменить значение, на которое указывает указатель, а не сам указатель.
Таким образом, вам нужно разыменовать указатель с помощью *pointer
:
void setChar(char* charToChange) {
*charToChange = 'B';
}
Если вы этого не сделаете, вы просто измените локальное значение charToChange
.
Ответ 5
Вам нужно разыменовать его, а литерал должен быть char, а не строкой, т.е. использовать апострофы, а не двойные кавычки:
void setChar(char* charToChange)
{
*charToChange = 'B';
}
Ответ 6
C копирует указатели, которые передаются в функции как параметры.
Таким образом, внутри функции вы управляете копией указателя,
а не самого указателя. Когда функция выходит, указатель, если он
было изменено, как в
while (p++) if (*p = '\0') break; //example
вернется к своему предыдущему значению, и копия будет уничтожена.
Объект памяти, на который указывает указатель, может быть изменен и
это и есть идея зайти по ссылке.
Распространенная ошибка заключается в попытке сбросить указатель внутри функции, а затем
обнаружив, что он не равен нулю при возврате функции. В некоторых системах вы возвращаете указатель, указывающий на мусор или плохие ячейки памяти, которые разбивают вашу программу при попытке чтения или записи в переменную.
void f(char* s)
{
/* code stuff */
...
s = NULL;
...
return;
}
при возврате из f теперь s =? (предыдущее значение, NULL или GARBAGE)
Это происходит чаще всего с переменными, переданными функциям, определенным в
отдельные модули, которые принимают значения по ссылке или в контекстах выполнения (например, потоки или разделяемая память между процессами).