C/Visual C - duda puntero

 
Vista:

duda puntero

Publicado por zauberberg (2 intervenciones) el 07/05/2008 18:03:19
Una pregunta, tengo una matriz, la llamaremos alfa[10][10], por ejemplo.

con el siguiente codigo:
for(i=0;i<10;i++){

*(*alfa +i)=3;
}

con que orden se va llenando la matriz? o sea, se llena la primera fila o la primera columna.

Gracias y perdonen por la ignorancia
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:duda puntero

Publicado por Nelek (816 intervenciones) el 07/05/2008 22:34:47
Hola,

En primer lugar... creo que la mejor manera seria compilar y mirar por ti mismo. De hecho yo lo hare en cuanto tenga el ordenador nuevo instalado (aqui no tengo compilador) ya que me parece una buena pregunta.

Aunque no estoy seguro de la respuesta a mi parecer se rellenara la fila, ya que los arrays reservan zonas de memoria contiguas y tu estas aumentando el direccionamiento en uno. Usando los indices normales alfa[i] rellenarias la primera columna, porque cada i implica los 10 elementos contiguos de esa fila. Pero al estar incrementando en una unidad la direccion a donde apunta el puntero *alfa (es decir el elemento alfa[0][0]), estas apuntando al elemento contiguo y, el elemento contiguo a alfa00 es alfa01, luego alfa02 y asi sucesivamente, con lo que acabarias rellenando la primera fila.

Por otro lado, depende de como declares las cosas puede darte fallos por mezclar tipos de variables y ni siquiera rellenarse la matriz.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda puntero

Publicado por eduardo (82 intervenciones) el 08/05/2008 00:43:24
Si no estoy equivocado tu instruccion esta mal, deberia ser:

for ( i = 0; i < 10; i++)
*( alfa + i ) = 3;

/* llena los 10 primeros elementos de la tabla con el valor 3, es decir la primera fila */

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda puntero

Publicado por zauberberg (2 intervenciones) el 08/05/2008 17:53:03
no, no Eduardo. Lo que yo tengo es una matriz. Y el codigo es *(*alfa+i)=3;.
lo he preguntado así porque tenia la duda concreta del orden de rellenado de la matriz. Pero tambien sería extrapolable a :

for i{
for j{
*(*(alfa +i)+j)=3
}
}

rellenando así toda la matriz. Mas como digo lo uqe yo queria saber es el orden.

Muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda puntero

Publicado por eduardo (82 intervenciones) el 11/05/2008 05:30:14
Lo que sucede es que no estas usando el operador * de manera correcta.
Este es el operador de indireccion que devuelve el valor situado en la direccion de su operando, "alpha" en tu caso: Ahora bien si tu haces
*(*alpha + i ) = 3;
o
*(*(alfa +i)+j) = 3;
Lo que haces es tratar de asignar el valor 3 en una direccion talvez ocupada por el sistema o por algun otro programa lo que es un error.
Volviendo a tu problema si lo que deseas es llenar la matriz usando Aritmetica de Punteros pues solo basta con hacer:

for ( i = 0; i < FILAS * COLUMNAS; i++ )
*( alpha + i ) = 3;

que es lo mismo

for ( i = 0; i < FILAS; i++ )
for ( j = 0; j < COLUMNAS; j++ )
alpha[ i ][ j ] = 3;

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda puntero

Publicado por Gilberto (31 intervenciones) el 11/05/2008 16:08:43
De hecho, la primera expresión es la correcta:

*(*alfa+i) = 3;

porque *alfa es interpretado como la dirección de la primera fila de la matriz, entonces *alfa + i es la dirección del iésimo elemento despues de esta, y *(*alfa+i) es el contenido de esa dirección.
La segunda forma

*(alfa+i) = 3;

es interpretada como una dirección, a la cual se intentaría asignar el valor 3, pero como un nombre de arreglo es una constante, el compilador marca un error, pidiendo un LValue del lado izquierdo de la asignación.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar