Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: class_OpenGL en 19 Julio 2016, 11:18 am



Título: (Consulta) Punteros a punteros en C
Publicado por: class_OpenGL en 19 Julio 2016, 11:18 am
Hola, muy buenas. Ante todo gracias por pasarlos, y por leer mi duda. El problema que tengo es con el siguiente código:

Código
  1. void funcion(const char * const * cadenas) {
  2. cadenas = 0xFFFFFFFF;
  3. }

Si yo compilo este código, no me dará un error como tal (simplemente una advertencia). Lo que me resulta raro es que si este código compila, significa que el último puntero es el que está tomando prioridad, porque el const opera sobre lo que tiene a su izquierda (a no ser que esté a la izquierda del todo, que en cuyo caso, opera sobre lo que tiene a la derecha). Es decir:

Código
  1. void funcion(const char * const * cadenas)
  2.               ^

Este const opera sobre el char

Código
  1. void funcion(const char * const * cadenas)
  2.                        ^   ^

Este const opera sobre el puntero señalado

Entones de esto deducimos que el único puntero no constante es el último. Al poder modificar en la función el valor del puntero dado, eso quiere decir que el último puntero es el que está tomando prioridad, mientras que debería tomar prioridad el primer puntero, es decir, este:

Código
  1. void funcion(const char * const * cadenas)
  2.                        ^

La duda final podría ser: por lo visto no entiendo/sé muy bien las reglas de prioridad, porque yo creía que al ser el mismo operador (*), tenía prioridad el de más a la izquierda, pero según lo expuesto, y en este caso, tiene más prioridad el de más a la derecha...


Título: Re: (Consulta) Punteros a punteros en C
Publicado por: class_OpenGL en 19 Julio 2016, 14:29 pm
Bueeno. Me responderé a mi mismo xD. Aunque haya dejado la pregunta aquí, tenía tanta curiosidad que seguí investigando. La respuesta la he descubierto aquí:
http://c.conclase.net/curso/index.php?cap=014#inicio (http://c.conclase.net/curso/index.php?cap=014#inicio)

Lo que pasa es que el operador *, para declarar variables, es especial (como otros pocos). Lo que tiene de especial es que se evalúa de derecha a izquierda, y si hay varios operadores con la misma prioridad que el *, se evalúan de derecha a izquierda, por lo que, en efecto, el último asterisco tiene más prioridad que el primero, porque es el que está más a la derecha.

Sé que lo he explicado un poco mal, así que recomiendo ver la página que he puesto :D