Все нижеприведенные данные печатают один и тот же адрес памяти:
int nums[] = {1, 2, 3};
printf("%p\n", &nums);
printf("%p\n", nums);
printf("%p\n", &nums[0]);
У nums var есть свой собственный адрес памяти, а массив является указателем на первый элемент массива. Итак, в адресном пространстве nums есть указатель (поэтому num занимает 8 байт). А адрес памяти первого элемента массива (последняя строка), который является целым числом, такой же, как у чисел, у которых есть указатель.
Так как же указатель и число сжаты в одном и том же блоке памяти?
Я ожидал, что значение указателя чисел будет отличаться от адреса памяти чисел. И я не вижу, как он указывает на целое число, которое является первым элементом в массиве, я вижу что-то вроде int * nums = & nums, указатель на себя (nums == & nums).