Оператор * - это то, что мы называем dereference operator. Чтобы понять, что он делает, вы должны точно понимать, что такое указатель.
Когда вы
char *p;
«переменный» р не использовать один и тот же объем памяти, как обычный полукокс, он использует больше памяти: она использует объем памяти, необходимый для правильной идентификации позиции памяти на вашем компьютере. Итак, допустим, вы используете 32-битную архитектуру, переменная p занимает 4 байта (а не 1 байт, который вы ожидаете от символа).
Итак, когда вы делаете
p = a;
вы видите ясно, что вы хотите изменить содержимое переменной р, то есть, вы ставите еще 32-разрядное число внутри него: вы меняете адрес его указывает на.
После выполнения этой строки значение p является адресом памяти массива символов a.
Теперь для оператор разыменования. Когда вы делаете
*p = 'Z';
вы сообщаете компилятору, что вы хотите сохранить значение «Z» на адрес, на который указывает р. Таким образом, значение p остается неизменным после этой строки: оно продолжает указывать на тот же адрес. Это значение этого адреса, который изменился и теперь содержит «Z».
Таким образом, конечный эффект
char a[] = {'a', 'b', 'c'};
char p = a;
*p = 'Z';
такое же, как изменения первой позиции массива А до «Z», то есть:
char a[] = {'a', 'b', 'c'};
a[0] = 'Z';
Примечание: есть разница при создании точки указателя на массив: переменная, содержащая массив, содержит только адрес первого элемента, поэтому a - это то же самое, что и «начальный адрес массива».
Обычно вы увидите оператора &. Это оператор, используемый для получения адреса памяти переменной. Например:
int number = 42;
int pointer = &number;
printf("%d", *pointer);
Здесь у нас есть все они. Первая строка создает целочисленную переменную и хранит внутри нее 42.
Вторая строка создает указатель на целое число и сохраняет адрес номер переменной внутри него.
Третья строка считывает значение по адресу, указанному Указатель.
Итак, хитрость заключается в том, чтобы читать * х, как по адресу, указанному на х и & х, как адрес х.
Btw, это не влияет на ответ, но нет такой вещи, как «Стандарт K & R C». K & R C, описанный в первом издании «Язык программирования C», теперь устарел. Стандарт C поставляется в двух основных вариантах: C89/C90 и C99. C89 также называется «ANSI C», поскольку ANSI опубликован в 1989 году, а затем ISO опубликовал фактически идентичный стандарт в 1990 году. C99 опубликован в другом порядке - сначала ISO, затем ANSI. Второе и третье издания книги K & R относятся к ANSI C, но я не думаю, что это делает «стандартным K & R C» –