Имея функцию, измените значение, которое указатель представляет в 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) Это происходит чаще всего с переменными, переданными функциям, определенным в отдельные модули, которые принимают значения по ссылке или в контекстах выполнения (например, потоки или разделяемая память между процессами).