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

Разница между [квадратными скобками] и * звездочкой

Если вы пишете функцию С++, например

void readEmStar( int *arrayOfInt )
{
}

vs функция С++, например:

void readEmSquare( int arrayOfInt[] )
{
}

В чем разница между использованием [квадратных скобок] vs * asterisk, и есть ли у кого-нибудь руководство по стилю, которое предпочтительнее, если они эквивалентны компилятору?

Для полноты примера

void readEmStar( int *arrayOfInt, int len )
{
  for( int i = 0 ; i < len; i++ )
    printf( "%d ", arrayOfInt[i] ) ;
  puts("");
}


void readEmSquare( int arrayOfInt[], int len )
{
  for( int i = 0 ; i < len; i++ )
    printf( "%d ", arrayOfInt[i] ) ;
  puts("");
}

int main()
{
  int r[] = { 2, 5, 8, 0, 22, 5 } ;

  readEmStar( r, 6 ) ;
  readEmSquare( r, 6 ) ;
}
4b9b3361

Ответ 1

Если вы используете тип char x[] вместо char *x без инициализации, вы можете считать их одинаковыми. Вы не можете объявить новый тип как char x[] без инициализации, но вы можете принять их как параметры для функций. В этом случае они совпадают с указателями.

Когда вы используете тип char x[] вместо char *x с инициализацией, они полностью на 100% отличаются.


Пример того, как char x[] отличается от char *x:

char sz[] = "hello";
char *p = "hello";

sz - это фактически массив, а не указатель.

assert(sizeof(sz) == 6);
assert(sizeof(sz) != sizeof(char*)); 
assert(sizeof(p) == sizeof(char*));

Пример того, как char x[] совпадает с char *x:

void test1(char *p)
{
  assert(sizeof(p) == sizeof(char*));
}

void test2(char p[])
{
  assert(sizeof(p) == sizeof(char*));
}

Стиль кодирования для перехода к функциям:

Не важно, что вы делаете. Некоторые люди предпочитают char x[], потому что ясно, что вы хотите передать массив, а не адрес одного элемента.

Обычно это уже ясно, потому что у вас будет другой параметр для длины массива.


Дальнейшее чтение:

См. этот пост под названием Массивы не совпадают с указателями!

Ответ 2

С++ Standard 13.1.3

- объявления параметров, которые различаются только в указателе * по сравнению с массивом [] эквивалентны. То есть массив декларация корректируется, чтобы стать декларация указателя (8.3.5). Только второй и последующие размеры массива значительны в типах параметров (8.3.4). [Пример:

 int f(char*);
 int f(char[]);  // same as f(char*);
 int f(char[7]);  // same as f(char*);
 int f(char[9]);  // same as f(char*);
 int g(char(*)[10]);
 int g(char[5][10]);  // same as g(char(*)[10]);
 int g(char[7][10]);  // same as g(char(*)[10]);
 int g(char(*)[20]);  // different from g(char(*)[10]);

-end пример]

Ответ 3

Нет никакой разницы между вашими двумя кодами, за исключением разного стиля. В обоих случаях массив передается по ссылке, а не по значению, поскольку параметры функции type *x и type x[] семантически одинаковы.

Ответ 4

В вопросе стиля я выдержу свою шею и скажу, что int * arrayOfInt лучше. Какой синтаксис вы используете, вы передаете указатель, и тип должен сделать это понятным.

Это только мое мнение.

Ответ 5

Два выражения эквивалентны. Каждый из них оценивает адрес первого элемента массива arrayOfInt.