Tôi là một trợ lý giảng dạy của một khóa học lập trình giới thiệu, và một số sinh viên làm này là loại lỗi:"Địa chỉ của" (&) một mảng/địa chỉ bị bỏ qua là gcc?
char name[20];
scanf("%s",&name);
mà không có gì ngạc nhiên khi họ đang học ... Điều gì là đáng ngạc nhiên là, bên cạnh cảnh báo gcc, mã hoạt động (ít nhất là phần này). Tôi đã cố gắng để hiểu và tôi đã viết đoạn mã sau:
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");
}
Biên soạn và thực hiệ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
bất cứ ai có thể giải thích lý do tại sao họ không khác nhau?
Tôi nghi ngờ đó là vì tôi không thể lấy địa chỉ của một mảng (vì tôi không thể có & &x
), nhưng trong trường hợp này mã không được biên dịch.
Chỉnh sửa: Tôi biết rằng một mảng tự nó giống với địa chỉ của phần tử đầu tiên, nhưng điều này không liên quan đến vấn đề này, tôi nghĩ vậy. Ví dụ:
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);
}
in:
$ ./a.out
1 1 1
1 0 0
Tôi không hiểu tại sao dòng thứ hai bắt đầu với 1
.
Chỉnh sửa của bạn cho biết rằng bạn cho rằng có một số con trỏ được lưu trữ cùng với mảng. Nhưng đó không phải là trường hợp. Một mảng bao gồm * chỉ * của các phần tử của nó. –
Tôi biết rằng một mảng chỉ là các phần tử, đó là lý do tại sao tôi nghĩ rằng nó không nên biên dịch. – dbarbosa