char x[100]
Массив x
распадается на указатель:
x
- указатель на символ (char *
)
&x
- указатель на массив из 100 символов (char (*)[100]
);
&x[0]
- указатель на символ (char *
)
все эти указатели ссылаются на одно и то же начало массива, отличается только тип . Тип имеет значение !!.
Вы не должны передавать &x
функциям, которые ожидают (char *
) параметров.
Почему тип имеет значение?:
char x[100];
int main()
{
printf("Address of x is %p, \t x + 1 - %p\t. The difference in bytes %zu\n", (void *)(x), (void *)(x + 1), (char *)(x + 1) - (char *)(x));
printf("Address of &x is %p, \t &x + 1 - %p\t. The difference in bytes %zu\n", (void *)(&x), (void *)(&x + 1), (char *)(&x + 1) - (char *)(&x));
printf("Address of &x[0] is %p, \t &x[0] + 1 - %p\t. The difference in bytes %zu\n", (void *)(&x[0]), (void *)(&x[0] + 1), (char *)(&x[0] + 1) - (char *)(&x[0]));
}
Результат:
Address of x is 0x601060, x + 1 - 0x601061 . The difference in bytes 1
Address of &x is 0x601060, &x + 1 - 0x6010c4 . The difference in bytes 100
Address of &x[0] is 0x601060, &x[0] + 1 - 0x601061 . The difference in bytes 1
https://godbolt.org/z/SLJ6xn