2011-04-05 10 views
6

Cuando crea el arreglo multidimensional char a[10][10], de acuerdo con mi libro dice que debe usar un parámetro similar a char a[][10] para pasar el conjunto a una función.Conjunto multidimensional y puntero a punteros

¿Por qué debe especificar la longitud como tal? ¿No está pasando un doble puntero a estar con, y ese puntero doble ya no apunta a la memoria asignada? Entonces, ¿por qué el parámetro no podría ser char **a? ¿Está la reasignación de cualquier nueva memoria mediante el suministro de los segundos 10.

Respuesta

12

Los punteros no son matrices

Un dereferenced char ** es un objeto de tipo char *.

A referencia char (*)[10] es un objeto de tipo char [10].

Las matrices no son punteros

Ver el c-faq entry about this very subject.


Suponga que tiene

char **pp; 
char (*pa)[10]; 

y, por el bien del argumento, ambos apuntan al mismo lugar: 0x420000.

pp == 0x420000; /* true */ 
(pp + 1) == 0x420000 + sizeof(char*); /* true */ 

pa == 0x420000; /* true */ 
(pa + 1) == 0x420000 + sizeof(char[10]); /* true */ 

(pp + 1) != (pa + 1) /* true (very very likely true) */ 

y es por eso el argumento no puede ser de tipo char**. También char** y char (*)[10] no son tipos compatibles, por lo que los tipos de argumentos (la matriz descompuesta) deben coincidir con los parámetros (el tipo en el prototipo de la función)

+0

La explicación que dio es muy clara, gracias :-). – rubixibuc

+0

También ese enlace que proporcionó es asombroso. – rubixibuc

+0

De nada. Me alegra que te guste el c-faq. No lea solo la sección 6: lea [todo] (http://c-faq.com/index.html). – pmg

1

estándar del lenguaje C, el proyecto de n1256:

6,3. 2.1 Lvalues, matrices y designadores de función
...
3, excepto cuando es el operando del operador sizeof o la unario & operador, o es un literal cadena que se utiliza para inicializar una matriz, una expresión que tiene el tipo '' gama de tipo ‘’ se convertido a una expresión con el tipo ‘‘puntero a tipo’’ que apunta al elemento inicial de el objeto de matriz y no es un lvalue. Si el objeto de matriz tiene una clase de almacenamiento de registro, el comportamiento de no está definido.

dado una declaración de

char a[10][10]; 

el tipo de la expresión de matriz a es "array de 10 elementos de la matriz de 10 elementos de char". Según la regla anterior, se codifica para que escriba "puntero a matriz de 10 elementos de char" o char (*)[10].

Recuerde que en el contexto de una declaración de parámetro de función, T a[N] y T a[] son idénticos a T *a; por lo tanto, T a[][10] es idéntico a T (*a)[10].

+0

Gracias por publicar eso, me ayudó también. :-) – rubixibuc