我有一个“v”数组,我想传递给一个函数。 “v”和“& v”是等价的还是它们之间有什么区别?
例如:
char v[4]
scanf("%s", v);
scanf("%s", &v);
答案 0 :(得分:2)
v
是v[0]
的地址,&v
是整个数组的地址。幸运的是两者都具有相同的价值。但是这些指针的任何算法都会以不同的方式访问。例如
(v+1)
和(&v + 1)
不相同。
答案 1 :(得分:1)
scanf
期望与%s
对应的参数的类型为char *
;表达式&v
将具有类型char (*)[4]
。即使值相同,类型也会不同,类型也很重要。
对于这种情况,您想将其称为
scanf("%s", v);
答案 2 :(得分:1)
您可以随时询问编译器本身......:
#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()
的正确表达式是第一个) 。如果你想对它们执行一些算术指针,它们的类型不一样。
答案 3 :(得分:0)
是如果你想知道数组的基地址,那么你可以写v即它会给出
array.and&amp; v中第一个元素的地址将给出完整数组的地址。
v[0]
与(v+0)
相同,v[1]
与(v+1)
相同,依此类推。
答案 4 :(得分:0)
v
,&v
,&v[0]
因类型而异,但价值却相同。
v
的类型为char[4]
;数组4 char
s &v
的类型为char (*) [4]
;指向4 char
s &v[0]
的类型为char*
;指向char