Мне сложно понять тип и использование имени массива в 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
для печати значения переменных указателя. Поскольку использование целочисленного заполнителя может печатать усеченные адреса. Но я просто хочу, чтобы все было просто.