Ответ 1
Вы передаете указатель на массив по значению, а не по ссылке. Это должно быть:
void changeArray(char **arr){
*arr = "bingo";
}
int main(int argc, const char* argv[]){
char *blah = "hello";
printf("Array is %s\n",blah);
changeArray(&blah);
printf("Array is %s\n",blah);
return EXIT_SUCCESS;
}
Вы указали адрес функции "привет" на функцию changeArray
, но в функции вы изменили переданное значение, а не исходный указатель. Изменение, которое я сделал, передает адрес указателя, и сам указатель изменяется в функции.
Пожалуйста, не char *blah = "hello";
определяет указатель на константную строку, а также *arr = "bingo";
, это и то, и другое, но если вы решили изменить сама строку, вы не сможете.
EDIT:
Когда вы передаете аргумент, даже указатель, функции, вы фактически копируете его в какое-то место, где функция читает его оттуда (обычно это стек). Вы не передаете сам аргумент, а копию его. Когда функция изменяет его (например, в arr = "bingo";
), он изменяет копию переменной, а не исходную переменную. Поэтому, чтобы изменить самую переменную, мы передаем адрес переменной функции (changeArray(&blah);
- &
означает address of-
), а в функции мы модифицируем переменную, сохраненную в адресе, который мы передали (*arr = "bingo";
- *
означает переменную в адресе arr
).
Предполагая, что исходный указатель blah
находится в адресе 0x00000000 и содержит адрес строки "hello"
, которая, например, 0x00000010. если вы передадите функцию blah
в функцию, вы скопируете ее в новую переменную arr
, которая находится в адресе 0x00000020, например
Variable Address content
-------------------------------
blah 00000000 00000010 (points to hello)
"hello" 00000010 "hello" (this is just an example, so don't be hard on me :) )
arr 00000020 00000010
"bingo" 00000030 "bingo" (and again...)
теперь, если вы измените содержимое arr
, вы измените значение в адресе 0x00000020, но не значение в адресе 0x000000000, поэтому blah
все еще содержит 00000010.
Variable Address content
-------------------------------
blah 00000000 00000010 (points to hello)
"hello" 00000010 "hello" (this is just an example, so don't be hard on me :) )
arr 00000020 00000030 (points to "bingo")
"bingo" 00000030 "bingo" (and again...)
Вместо этого мы копируем адрес blah
, который равен 0x00000000, на arr
, а в функции, которую мы говорим, - контент of arr - это адрес, перейдите на этот адрес и измените его содержимое, чтобы указать на строку "bingo". поэтому теперь содержимое в адресе 0x00000000 (которое blah
) указывает на "бинго".
Variable Address content
-------------------------------
blah 00000000 00000030 (points to "bingo")
"hello" 00000010 "hello" (this is just an example, so don't be hard on me :) )
arr 00000020 00000000 (points to `blah`)
"bingo" 00000030 "bingo" (and again...)
Надеюсь, я тебя не смутил...