Soy un asistente de enseñanza de un curso de introducción a la programación, y algunos estudiantes hacen este tipo de error:"Dirección de" (&) una matriz/dirección de ser ignorada ser gcc?
char name[20];
scanf("%s",&name);
lo cual no es sorprendente, ya que están aprendiendo ... Lo que es sorprendente es que, además de la advertencia gcc, el código funciona (al menos esta parte). He estado tratando de entender y escribí el siguiente código:
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");
}
Compilar y ejecutar:
$ 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
Puede alguien explicar por qué no son diferentes?
Sospecho que es porque no puedo obtener la dirección de una matriz (ya que no puedo tener & &x
), pero en este caso el código no debería compilarse.
Editar: Sé que una matriz en sí misma es igual a la dirección del primer elemento, pero esto no está relacionado con este problema, creo. Por ejemplo:
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);
}
impresiones:
$ ./a.out
1 1 1
1 0 0
no entiendo por qué la segunda línea comienza con 1
.
Su edición indica que cree que hay algún puntero almacenado junto con la matriz. Pero ese no es el caso. Una matriz consiste * solo * de sus elementos. –
Sabía que una matriz solo son elementos, por eso pensé que no debería compilarse. – dbarbosa