Вопрос относительно размера переменных целочисленного указателя в C

Я написал эту очень простую программу для проверки размера целочисленных указателей в c.

#include <stdio.h>

int main(void) {
    
    int i = 10;
    int* i_ptr = &i;    
    int arr[3] = {13, 14, 15};

    printf("\n ... Size of an integer pointer is: %ld bytes and %ld bits ...", sizeof(i_ptr), 8*sizeof(i_ptr));    
    printf("\n\n ... Size of a 3-element integer array is: %ld bytes and %ld bits ...\n\n", sizeof(arr), 8*sizeof(arr));
    printf(" ... Size of the *arr element is: %ld bytes and %ld bits ...\n\n", sizeof(*arr), 8*sizeof(*arr));

    return 0;
}

Вывод относительно размера различных переменных был следующим:

... Size of an integer pointer is: 8 bytes and 64 bits ...

... Size of a 3-element integer array is: 12 bytes and 96 bits ...

... Size of the *arr element is: 4 bytes and 32 bits ...

Теперь мои вопросы следующие. Поскольку я использую 64-битную операционную систему Linux, я понимаю, что размер целочисленной переменной-указателя составляет 64 бита. Размер целочисленного массива составляет 12 байт, так как целое число занимает 4 байта памяти, а массив состоит из 3 целых чисел. Однако, когда я думаю, что массив в основном является указателем в C, а переменная массива указывает на первый элемент массива, я предположил, что размер массива будет напоминать размер соответствующих указателей. Тем не менее, я также понимаю, что это не означает, что размер массива будет 24 байта, а размер 3 целых указателей. Это кажется мне запутанным, поэтому любые советы будут оценены.

массив в основном является указателем в C" - это совсем не правильно. массивы могут распадаться на указатели, но они не "в основном одинаковы

UnholySheep 18.12.2020 20:41
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
1
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Массивы не являются указателями. Если вы объявляете объект типа массива, то его размер равен количеству байтов, занимаемых элементами массива.

Но указатели массивов, используемые в выражениях, за редким исключением, например, используемые в качестве операндов оператора sizeof, преобразуются в указатели на их первые элементы.

Из стандарта C (6.3.2.1 Lvalues, массивы и указатели функций)

3 За исключением случаев, когда это операнд оператора sizeof или унарного & оператор или строковый литерал, используемый для инициализации массива, выражение, имеющее тип «массив типов», преобразуется в выражение с типом «указатель на тип», который указывает на начальный элемент объекта массива и не является lvalue. Если объект массива имеет класс хранения регистра, поведение не определено.

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