In C, * и & являются операторами указателя. * используется для создания указателей переменных и разыменования их. & используется для получения адреса памяти чего-либо.
Следующий код (1) создает int a, (2) создает указатель int p с помощью *, а (3) устанавливает значение указателя p равным адрес памяти использования &.
int a;
int *p;
p = &a;
printf("%d", p);
printf("%d", *p);
При первом выводе возвращается значение p, которое является адресом памяти a. Во втором выводе мы разыменовываем p, что дает нам данные, хранящиеся по этому адресу памяти - значение int a.
Существуют и другие способы использования указателей. Когда вы создаете массив ...
int arr[10];
... вы неявно создаете указатель ("arr") на первый элемент в вашем массиве. Вы можете получить доступ к элементам, если массив несколькими способами.
arr[5]
*(arr + 5)
Оба получают 5-й элемент массива, посмотрев на arr ( адрес памяти первого элемента) и добавив 5 , который дает нам адрес памяти 5-го элемента, а затем разыменовывает его с помощью *, чтобы получить значение 5-го элемента.
...
Ваш код неправильно не из-за неправильного использования & и *, а из-за поведения scanf (которое на самом деле не следует использовать). Scanf записывает в буфер, который затем необходимо скопировать, чтобы сохранить значение. Кроме того, учитывая, что вы сканируете только один символ, нет необходимости использовать массив символов. Проверьте это решение:
char buf, replacechar, newchar;
printf("What character do you want to replace: ");
scanf("%c", &buf);
replacechar = buf;
printf("What is the replacement character: ");
scanf("%s", &buf);
newchar = buf;
printf("You want to replace %c with %c\n", replacechar,
newchar);
for (int i = len-1; i > -1; --i) {
if (word[i] == replacechar && word[i] != '\0') {
printf("Found one!\n");
word[i] = newchar;
}
}