我是一门编程入门课程的助教,有同学犯了这样的错误:
char name[20];
scanf("%s",&name);
这并不奇怪,因为他们正在学习......令人惊讶的是,除了 gcc 警告之外,代码还有效(至少这部分)。我一直在尝试理解,并编写了以下代码:
void foo(int *v1, int *v2) {
if (v1 == v2)
printf("Both pointers are the same\n");
else
printf("They are not the same\n");
}
int main() {
int test[50];
foo(&test, test);
if (&test == test)
printf("Both pointers are the same\n");
else
printf("They are not the same\n");
}
编译和执行:
$ gcc test.c -g
test.c: In function ‘main’:
test.c:12: warning: passing argument 1 of ‘foo’ from incompatible pointer type
test.c:13: warning: comparison of distinct pointer types lacks a cast
$ ./a.out
Both pointers are the same
Both pointers are the same
谁能解释为什么它们没有什么不同?
我怀疑这是因为我无法获得数组的地址(因为我无法获得& &x
),但在这种情况下,代码不应编译。
编辑:我知道一个数组本身与第一个元素的地址相同,但这与这个问题无关,我认为。例如:
int main() {
int a[50];
int * p = a;
printf("%d %d %d\n", p == a, p == &a[0], &p[0] == a);
printf("%d %d %d\n", p == &a, &p == a, &p == &a);
}
印刷:
$ ./a.out
1 1 1
1 0 0
我不明白为什么第二行以1
.