C указатели и массивы/оператор 'sizeof'
Возможный дубликат: Разница указателя стека для указателя и массива char
Чтобы проиллюстрировать мой вопрос:
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;
}
Во-первых, мое предположение верно?
И затем, полагая, что мое предположение верно, какое подробное объяснение? Я понимаю, что мой 20-элементный массив равен 80 байтам, но не является ли это имя myary
просто указателем на первый элемент массива? Так и не должно быть 4?
Ответы
Ответ 1
Да, ваше предположение верно, если int
и указатель на вашем компьютере длиной 4 байта.
И нет, массивы не являются указателями. Имя массива иногда распадается на указатель в определенных контекстах, но это не одно и то же. Существует весь раздел часто задаваемых вопросов comp.lang.c, посвященный этой общей точке путаницы.
Ответ 2
Размер массива не сохраняется в памяти в любом случае, объявляете ли вы его как int myArr[20]
или int* myArrPtr
.
Случается, что sizeof()
заменяется (компилятором) на постоянное значение.
Поэтому, поскольку myArr
был задан с фиксированным размером до компиляции, компилятор знает, насколько большой объем выделенной памяти. С помощью myArrPtr
вы можете динамически распределять разные размеры массива, поэтому сохраняется только размер типа.