Мне сложно понять тип и использование имени массива в C. Это может показаться длинным, но, пожалуйста, несите меня.
Я понимаю, что следующий оператор объявляет a типом int [] i.e массив целых чисел.
int a[30];
Пока a также указывает первый элемент массива, и такие вещи, как *(a+2), действительны. Таким образом, сделать a похожим на указатель на целое число. Но на самом деле типы int [] и int* различны; в то время как первый тип массива, а позже - указатель для целого числа.
Также переменная типа int [] преобразуется в переменную типа int* при передаче ее функциям; как в C массивы передаются по ссылке (за исключением оператора sizeof).
Вот точка, которая заставляет меня болтаться. Посмотрите следующий фрагмент кода:
int main()
{
int (*p)[3];
int a[3] = { 5, 4, 6 };
p = &a;
printf("a:%d\t&a:%d\n",a,&a);
printf("%d",*(*p + 2));
}
ВЫВОД:
a:2686720 &a:2686720
6
Итак, как работает вышеуказанный код? У меня есть два вопроса:
-
aи&aимеют одинаковые значения. Почему? - Что именно делает
int (*p)[3];? Он объявляет указатель на массив, я это знаю. Но как указатель на массив отличается от указателя первым элементом массива и именем массива?
Может ли кто-нибудь прояснить ситуацию? У меня много путаницы.
Я знаю, что я должен использовать %p в качестве заполнителя вместо использования %d для печати значения переменных указателя. Поскольку использование целочисленного заполнителя может печатать усеченные адреса. Но я просто хочу, чтобы все было просто.

