У меня есть массив «v», который я хочу передать функции. Являются ли «v» и «& v» эквивалентными или существует ли разница между ними?Синтаксис для передачи массива функции
Например:
char v[4]
scanf("%s", v);
scanf("%s", &v);
У меня есть массив «v», который я хочу передать функции. Являются ли «v» и «& v» эквивалентными или существует ли разница между ними?Синтаксис для передачи массива функции
Например:
char v[4]
scanf("%s", v);
scanf("%s", &v);
v
, &v
, &v[0]
отличается по типу, но по значению они одинаковы.
v
имеет тип char[4]
; массив из 4 char
s&v
имеет тип char (*) [4]
; указатель на массив из 4 char
s&v[0]
имеет тип char*
; указатель на char
v
является адрес v[0]
и &v
это адрес всего массива. К счастью, обе они будут иметь такую же ценность. Но любая арифметика на этих указателях будет иметь доступ по-разному. Например,
(v+1)
и (&v + 1)
не то же самое.
Да Если вы хотите знать базовый адрес массива, то вы можете просто написать V т.е. Это даст
адрес первого элемента в array.and & V даст адрес полного массива.
v[0]
такое же как (v+0)
, v[1]
такое же как (v+1)
и так далее.
надеюсь, что вы его получите.
scanf
ожидает аргумент, соответствующий %s
иметь тип char *
; выражение &v
будет иметь тип char (*)[4]
. Несмотря на то, что значения будут одинаковыми, типы будут разными и будут иметь значение.
Для этого случая вы хотите назвать это как
scanf("%s", v);
Вы всегда можете обратиться к самому компилятором ...:
#include <stdio.h>
int main()
{
char v[4];
printf (" v &v &v[0]\n");
printf ("%p %p %p\n", v, &v, &v[0]);
printf ("%p %p %p\n", v+1, &v+1, &v[0]+1);
return 0;
}
Использование MinGW2.95, это печатает следующие:
v &v &v[0]
0240FF24 0240FF24 0240FF24
0240FF25 0240FF28 0240FF25
Как вы видите, три выражения дают то же значение для адреса базового массива, поэтому их можно использовать с scanf()
(хотя я согласен с тем, что правильное выражение для scanf()
является первым). Если вы хотите выполнить некоторые арифметические указатели на них, они не имеют одинакового типа.