C указатели и массивы / оператор ‘sizeof’
Возможный дубликат: разность указателей стека для указателя и массива символов
Чтобы проиллюстрировать мой вопрос:
int main(void){ int myary[20]; int *myaryPtr; myaryPtr = myary; sizeof(myary); // Will it return 80? Correct? sizeof(myaryPtr); // Will it return 4? Correct? return 0; }
Во-первых, мое предположение верно?
- Должен ли я использовать static_cast или reinterpret_cast при запуске void * на все
- указатель на массив c ++
- указатель указателя в связанном списке добавить
- Почему cout печатает массивы char по-разному от других массивов?
- Длина массива в аргументе функции
И затем, полагая, что мое предположение верно, какое подробное объяснение? Я понимаю, что мой 20-элементный массив равен 80 байтам, но не является ли myary
просто указателем на первый элемент массива? Так не должно ли это быть 4?
- Как изменить указатель, который был передан в функцию в C?
- const с указателями в C
- C ++ Доступный элемент classа из указателя базового classа
- Передайте двумерный массив функции постоянного параметра
- Необходимость указателя на указатель
- Ближние и дальние указатели
- Как delete знает, что это массив?
- size_t vs. uintptr_t
Да, ваше предположение верно, если int
и указатель имеют длину 4 байта на вашем компьютере.
И нет, массивы не являются указателями. Имя массива иногда распадается на указатель в определенных контекстах, но это не одно и то же. Существует целый раздел часто задаваемых вопросов comp.lang.c, посвященный этой общей точке путаницы.
Размер массива не сохраняется в памяти в любом случае, объявляете ли вы его как int myArr[20]
или int* myArrPtr
.
Случается, что sizeof()
заменяется (компилятором) постоянным значением .
Поэтому, поскольку myArr
был задан с фиксированным размером до компиляции, компилятор знает, насколько большой объем выделенной памяти. С myArrPtr
вы можете динамически распределять разные размеры массива, поэтому сохраняется только размер типа .