Разница между [квадратными скобками] и * звездочкой
Если вы пишете функцию С++, например
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 ) ;
}
Ответы
Ответ 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.