Размеры массивов, объявленных указателями

char c[] = "Hello"; char *p = "Hello"; printf("%i", sizeof(c)); \\Prints 6 printf("%i", sizeof(p)); \\Prints 4 

Мой вопрос:

Почему они печатают разные результаты? Не c[] также объявляет указатель, указывающий на первый символ массива (и, следовательно, должен иметь размер 4, так как это указатель)?

Похоже, вы путаетесь между указателями и массивами. Указатели и массивы (в этом случае char * и char [] ) – это не одно и то же.

  • Массив массива char a[SIZE] говорит, что значение в местоположении a представляет собой массив длины SIZE
  • Указатель char *a; говорит, что значение в местоположении a является указателем на char . Это может быть объединено с арифметикой указателя, чтобы вести себя как массив (например, a[10] – 10 записей в прошлом, где бы a точки)

В памяти это выглядит так (пример, взятый из FAQ ):

  char a[] = "hello"; // array +---+---+---+---+---+---+ a: | h | e | l | l | o |\0 | +---+---+---+---+---+---+ char *p = "world"; // pointer +-----+ +---+---+---+---+---+---+ p: | *======> | w | o | r | l | d |\0 | +-----+ +---+---+---+---+---+---+ 

Легко смутить разницу между указателями и массивами, потому что во многих случаях ссылка на массив «распадается» на указатель на его первый элемент. Это означает, что во многих случаях (например, когда передается вызов функции) массивы становятся указателями. Если вы хотите узнать больше, в этом разделе FAQ часто задаются различия .

Одно существенное отличие заключается в том, что компилятор знает, как долго массив. Используя приведенные выше примеры:

 char a[] = "hello"; char *p = "world"; sizeof(a); // 6 - one byte for each character in the string, // one for the '\0' terminator sizeof(p); // whatever the size of the pointer is // probably 4 or 8 on most machines (depending on whether it's a // 32 or 64 bit machine) 

Два операнда sizeof имеют разные типы. Один из них – массив char , другой – указатель на char .

В стандарте C говорится, что когда оператор sizeof применяется к массиву, результатом является общее количество байтов в массиве. c – массив из шести char включающий в себя NUL терминатор, а размер char равен 1, поэтому sizeof (c) равен 6.

Однако размер указателя зависит от реализации. p – указатель на char . В вашей системе размер указателя на char составляет 4 байта. Вот что вы видите с sizeof (p) .

Однако, если вы попробуете sizeof(*p) и sizeof(*c) , они оба будут оценивать до 1, поскольку указатель разыменования и первый элемент массива являются символами типа char .

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

«sizeof» – это директива компиляторов. Результат указывает размер в памяти, который занимает аргумент. Компилятор является неотъемлемым для определения результата в соответствии с типом аргумента. Что касается «массива», возвращает размер массива. кроме того, указатель возвращает «4», вообще говоря, для 32-битной машины.

указатель и массив различны.

char c[] = "Hello"; // объявляем c как массив. sizeof (c) рассчитать размер массива 6.
char *p = "Hello"; // объявлять p как pointer.sizeof (p) вычислять размер указателя, в большинстве машин размер указателя равен 4.

вы также можете обратиться к < c ловушкам и ловушкам >.