Я всегда думал, что * & p = p = & * p в C. Я попробовал этот код:
#include <stdio.h>
#include <stdlib.h>
char a[] = "programming";
char *ap = &a[4];
int main(void)
{
printf("%x %x %x\n", ap, &*(ap), *&(ap)); /* line 13 */
printf("%x %x %x\n\n", ap+1, &*(ap+1), *&(ap+1)); /* line 14 */
}
Первая строка printf (строка 13) дает мне адреса:
40b0a8 40b0a8 40b0a8
, которые соответствуют ожидаемым.Но когда я добавил вторую строку printf, Borland жалуется:
"first.c": E2027 Должен получить адрес ячейки памяти в функции main в строке 14
Я ожидал получить:
40b0a9 40b0a9 40b0a9.
Кажется, что выражение * & (ap + 1) в строке 14 является виновником здесь.Я думал, что все три выражения указателя в строке 14 эквивалентны.Почему я не так думаю?
Второй связанный с этим вопрос: строка
char *ap = a;
указывает на первый элемент массива a.Я использовал
char *ap = &a[4];
, чтобы указать на 5-й элемент массива a.
Является ли выражение
char *ap = a;
таким же, как выражение
char *ap = &a[0];
Последнее выражение только более многословно, чем предыдущее?
Большое спасибо ...