Наличие функции, изменяющей значение, которое указатель представляет в C

У меня есть main функция, которая имеет символ, я пытаюсь передать указатель на это char в функцию и заставить его изменить его A в B но это, кажется, не меняет этого. Пример, показанный здесь, является просто текущим состоянием кода, который я пробовал на различных вариациях, поэтому могут быть и другие ошибки, связанные с простым захватыванием соломинок.

int main()
{
    char result = 'A';
    setChar(&result);
    printf("%C", result);
}

void setChar(char* charToChange)
{
    charToChange = "B";
}

7 ответов

Решение

Что вы хотите *charToChange = 'b';, Указатель charToChange является локальной переменной (параметром) в setChar, но вы можете изменить то, на что он указывает, используя префикс * оператор и назначение. Обратите внимание, что *charToChange это тоже символ, а не строка.

Вы должны разыменовать указатель, переданный setChar() чтобы изменить значение, на которое он указывает, а не сам аргумент указателя.

Вы также должны использовать буквальный символ 'B' вместо строкового литерала "B" (который является указателем на charне char).

void setChar(char* charToChange)
{
    *charToChange = 'B';
}

Когда вы вызываете функцию setChar с параметром &result в качестве параметра, она передает адрес результата, в котором она хранится.

поэтому он присваивается указателю char * charToChange

Допустим, что адрес результата равен [0x00000010] -> 'A'

А адрес charToChange - [0x00000100] -> 0x00000010

Теперь, когда вы пытаетесь написать charToChange = "B";

Он создает новую память, где он хранит "B"

Let Say [0x00001000] -> 'B' && [0x00001001] -> '\ 0'

Так что при выполнении задания он хранит

[0x00000100] -> 0x00001000

Но все же адрес 0x00000010 указывает на

Так что это неправильно

Вы должны заменить charToChange = "B"; в

*charToChange = 'B';

Так что значение в 0x00000100 становится "B"

Всегда помни

* Означает ValueAt И

& Средства AddressOf

Вы хотите изменить значение, на которое указывает указатель, а не сам указатель.

Таким образом, вам нужно разыменовать указатель с помощью *pointer:

void setChar(char* charToChange) {
    *charToChange = 'B';
}

Если вы этого не сделаете, вы просто измените локальное значение charToChange,

Вы должны разыменовать его, и литерал должен быть символом, а не строкой, то есть использовать апострофы, а не двойные кавычки:

void setChar(char* charToChange)
{
    *charToChange = 'B';
}

C копирует указатели, которые передаются в функции в качестве параметров. Таким образом, внутри функции вы управляете копией указателя, а не самим указателем. При выходе из функции указатель, если он был изменен, как в

 while (p++)  if (*p = '\0') break;  //example

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

void f(char* s)
{
  /* code stuff */
...
s = NULL;
...
return;
}

по возвращении из f теперь s =? (предыдущее значение, NULL или GARBAGE) Это чаще всего случается с переменными, передаваемыми в функции, определенные в отдельных модулях, которые принимают значения по ссылке или в разных контекстах выполнения (например, потоки или общая память между процессами).

      #include <stdio.h>

void x(char* a){
    *a = *"c";  // here variable a value change into "b"
}
int main()
{
    char a = 'a';
    x(&a);
    printf("%c\n",a);
    return 0;
}
Другие вопросы по тегам