Почему в этой программе размер целого числа равен 8?

// pointer of array

#include<stdio.h>

int main()
{
    int arr[] = { 3, 5, 6, 7, 9 };
    int *p = arr;
    int (*ptr)[5] = &arr;

    printf("p = %p, ptr = %p\n", p, ptr);

    printf("*p = %d, *ptr = %p\n", *p, *ptr);

    printf("sizeof(p) = %lu, sizeof(*p) = %lu\n",
                          sizeof(p), sizeof(*p));

    printf("sizeof(ptr) = %lu, sizeof(*ptr) = %lu\n",
                        sizeof(ptr), sizeof(*ptr));

    return 0;
}

Выход

p = 0x7ffde1ee5010, ptr = 0x7ffde1ee5010
*p = 3, *ptr = 0x7ffde1ee5010
sizeof(p) = 8, sizeof(*p) = 4
sizeof(ptr) = 8, sizeof(*ptr) = 20

Вот почему sizeof(p) или sizeof(ptr) равно 8?

Этот код является примером указателя на массив

Почему 8, а почему не 4?

Пожалуйста, помните, что и p, и ptr являются указателями. А в 64-битных системах указатели обычно имеют размер 8 байт (64 бита).

Some programmer dude 03.04.2023 09:03

@Someprogrammerdude, тогда почему *ptr = 20

The professor 03.04.2023 09:31

Потому что ptr указывает на массив из пяти 4-байтовых int элементов. Это означает, что *ptr — это сам массив размером 5 * sizeof(int) (то есть 5 * 4) байт. ptr — указатель, *ptr — объект, на который указывает ptr.

Some programmer dude 03.04.2023 09:44
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
3
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В 64-битной системе, которой, очевидно, является ваша, указатели представлены 8 байтами, независимо от того, на что они указывают.

В вашем примере и p, и ptr являются указателями. В случае p у нас есть указатель на первый int в массиве. Очевидно, в вашей системе int занимает 4 байта. В случае ptr он был объявлен как указатель на массив из 5 значений int, что составляет 20 байт.

Другие вопросы по теме