Наличие функции, изменяющей значение, которое указатель представляет в 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;
}