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; } 

Во-первых, мое предположение верно?

И затем, полагая, что мое предположение верно, какое подробное объяснение? Я понимаю, что мой 20-элементный массив равен 80 байтам, но не является ли myary просто указателем на первый элемент массива? Так не должно ли это быть 4?

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

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

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

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

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

  • char pointer запутанный с cout в c ++
  • Получить указатель функции из std :: function при использовании std :: bind
  • Что гарантируется относительно размера указателя функции?
  • Является ли указатель с правильным адресом и типом все еще всегда действительным указателем с C ++ 17?
  • Выражения указателя: * ptr ++, * ++ ptr и ++ * ptr
  • Зачем мне нужно использовать тип ** для указания типа *?
  • Тип ссылки в C #
  • Передача указателей между C и Java через JNI
  • Как сделать буквенный * int64 в Go?
  • Какой тип указателя я использую, когда?
  • Возвращаемые массивы из функции в c ++
  • Давайте будем гением компьютера.