Для программы:
#include<stdio.h>
int main(void)
{
int (*a)[2];
int b[5];
printf("sizeof(int) : %zu\n", sizeof(int));
printf("sizeof(int*) : %zu\n", sizeof(int*));
printf("sizeof(b) : %zu\n",sizeof(b));
printf("sizeof((int*)b) : %zu\n",sizeof((int*)b));
printf("sizeof(&b[0]) : %zu\n",sizeof(&b[0]));
printf("sizeof(a) : %zu\n",sizeof(a));
printf("sizeof(a[0]) : %zu\n",sizeof(a[0]));
printf("sizeof(a[1]) : %zu\n",sizeof(a[1]));
return 0;
}
Выход:
sizeof(int) : 4 -> Fact 1
sizeof(int*) : 8 -> Fact 2
sizeof(b) : 20 -> Case 1
sizeof((int*)b) : 8 -> Case 2
sizeof(&b[0]) : 8 -> Case 3
sizeof(a) : 8 -> Case 4
sizeof(a[0]) : 8 -> Case 5
sizeof(a[1]) : 8 -> Case 6
Вопросы/наблюдения (в случае заказа):
-
Выводится ли случай 1, потому что
b
был объявлен как массив целых чисел, т.е.int[]
? Полный блок в байтах возвращается как подтверждено Fact1. Не правда ли? -
Мне кажется, что отличное отбрасывание
b
доint*
. Здесьb
считается указателем. Я подтвердил это с помощью Fact2. Правильно или неправильно? -
&b[0]
распадается на указательb
. Выход совпадает с Fact2. -
I ожидаемый 16 здесь, но я получил 8 в качестве вывода. Я пришел к выводу, что это связано с тем, что
a
является последующим указателем, а выход совпадает с Fact2. Я получил результат, похожий на вопрос 2. -
a[0]
- указатель. Выход совпадает с Fact2 -
a[1]
- указатель. Выход совпадает с Fact2
Пожалуйста, ответьте на вопросы и исправьте меня, если какое-либо из замечаний неверно.