Наличие функции, изменяющей значение, которое указатель представляет в C - PullRequest
16 голосов
/ 30 января 2011

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

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

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

Ответы [ 6 ]

23 голосов
/ 30 января 2011

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

11 голосов
/ 30 января 2011

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

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

void setChar(char* charToChange)
{
    *charToChange = 'B';
}
9 голосов
/ 10 декабря 2013

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

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

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

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

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

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

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

Так, делая Присвоение, он сохраняет

[0x00000100] -> 0x00001000

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

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

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

* charToChange = 'B';

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

Всегда помни

* Значение ValueAt И

& Means AddressOf

3 голосов
/ 30 января 2011

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

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

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

Если нет, просто измените локальное значение charToChange.

2 голосов
/ 30 января 2011

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

void setChar(char* charToChange)
{
    *charToChange = 'B';
}
1 голос
/ 18 апреля 2015

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...