2016-12-26 11 views
2

Да, это было задано раньше, много раз, но я хочу знать, какой из них более целесообразен?«Массив» и «& array [0]» полностью взаимозаменяемы?

typedef struct { 
    int a; 
    int addr[8]; 
} usr_command; 

usr_command* p_usr_command; 

int foo(int* parameter) 
{} 

И какой из них менее подвержен проблематике?

foo(p_usr_command->addr); 

или

foo(&p_usr_command->addr[0]); 

?

+4

Попробуйте 'sizeof (array)' versus 'sizeof (& array [0])'. – EOF

+0

Что такое 'inventory_addr'? –

+1

@EOF и, по иронии судьбы, это как раз разница. однако это не тот же случай. –

ответ

8

В это случае (передавая имя массива против передачи адреса первого объекта в массиве в качестве аргумента функции), оба фрагменты эквивалентны.

Цитирование C11, глава §6.3.2.1, Lvalues, массивы и функции обозначения (курсив мой )

исключением случаев, когда это операнд оператора sizeof, оператор _Alignof, или унарный оператор & или строковый литерал, используемый для инициализации массива, выражение, которое имеет тип '' array of type '' преобразуется в выражение wi го типа '' указатель на тип '', который указывает на начальный элемент объекта массива и не является значением lvalue. [....]

Однако, в целом, они не то же самое.

  • array является массив типа int [8]
  • &(array[0]) является указатель, тип int *

Как уже было предложено EOF in his comment, попробуйте передать оба варианта оператору sizeof и проверить чтобы получить практический выход.