【发布时间】:2013-11-29 12:19:53
【问题描述】:
我有一个要传递给函数的“v”数组。 “v”和“&v”是等价的还是它们之间有什么区别?
例如:
char v[4]
scanf("%s", v);
scanf("%s", &v);
【问题讨论】:
标签: c arrays function pointers parameters
我有一个要传递给函数的“v”数组。 “v”和“&v”是等价的还是它们之间有什么区别?
例如:
char v[4]
scanf("%s", v);
scanf("%s", &v);
【问题讨论】:
标签: c arrays function pointers parameters
v 是v[0] 的地址,&v 是整个数组的地址。幸运的是,两者都具有相同的价值。但是对这些指针的任何算术都会以不同的方式访问。例如
(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() 的正确表达式是第一个)。如果你想对它们执行一些算术指针,它们的类型不同。
【讨论】:
v、&v、&v[0] 类型不同,但值相同。
v 是 char[4] 类型; 4 个chars 的数组&v 是 char (*) [4] 类型;指向 4 个数组的指针 chars&v[0] 是 char* 类型;指向char 的指针
【讨论】:
是的,如果你想知道数组的基地址,那么你可以写 v 即它会给
array.and 中第一个元素的地址。 &v 将给出完整数组的地址。
v[0] 与(v+0) 相同,v[1] 与(v+1) 相同等等。
希望你能明白。
【讨论】: