Подтвердить что ты не робот

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?

4b9b3361

Ответ 1

Да, ваше предположение верно, если int и указатель на вашем компьютере длиной 4 байта.

И нет, массивы не являются указателями. Имя массива иногда распадается на указатель в определенных контекстах, но это не одно и то же. Существует весь раздел часто задаваемых вопросов comp.lang.c, посвященный этой общей точке путаницы.

Ответ 2

Размер массива не сохраняется в памяти в любом случае, объявляете ли вы его как int myArr[20] или int* myArrPtr.

Случается, что sizeof() заменяется (компилятором) на постоянное значение.

Поэтому, поскольку myArr был задан с фиксированным размером до компиляции, компилятор знает, насколько большой объем выделенной памяти. С помощью myArrPtr вы можете динамически распределять разные размеры массива, поэтому сохраняется только размер типа.