[C con Clase] Más punteros

Programante programante en gmail.com
Mar Feb 27 23:06:29 CET 2007


Alejandro Vilar López escribió:
> Muchas gracias por vuestra ayuda con los punteros. A ver si consigo 
> verles la utilidad, pero, por ahora tengo otras dos dudas:
>  
> Si en un programa yo hago "p* ++" no me incrementa el número que tiene 
> la variable a la que apunto, si no que muestra números sin sentido. 
> Sin embargo, si hago "++ *p" si que me funciona. ¿Por qué?
p*++ no es válido. Debes referirte a *p++
Esto se debe a las prioridades entre operadores.
La primera expresión puede hacerse intentando hacer dos cosas distintas 
(todos los compiladores harán siempre lo mismo hay unas normas 
establecidas, el problema es cuando tú piensas que se siguen otras): 
desreferencias el puntero y avanzas la posición a la que apunta *(p++) o 
incrementas el valor de la variable a la que apunta (*p)++
En cambio la segunda sólo tiene una interpretación posible: ++(*p)
>  
> ¿Me podéis explicar esta parte del curso?:
>  
> * *
>
> *Comparación entre punteros.*
>
> Comparar punteros puede tener sentido en la misma situación en la que 
> lo tiene restar
>
> punteros, es decir, averiguar posiciones relativas entre punteros que 
> apunten a elementos
>
> del mismo array.
>
>  
>
> Hasta aquí entiendo
>
>  
>
> Existe otra comparación que se realiza muy frecuente con los punteros. 
> Para averiguar si
>
> estamos usando un puntero es corriente hacer la comparación:
>
> if(NULL != p)
>
>  
>
> o simplemente
>
> if(p)
>
>  
>
> Y también:
>
> if(NULL == p)
>
>  
>
> O simplemente
>
> if(!p)
>
>  
>
> Pero en esta parte no entiendo la utilidad de los 'if' ni para qué los 
> usáis. ¿Me lo podéis explicar?
>
Los dos primeros if buscan saber si p es un puntero nulo, mientras que 
los dos últimos comprueban que no lo sea. Un puntero nulo "apunta a un 
sitio donde no hay memoria". Se usa para diferenciarlo de posiciones 
válidas.
Ejemplo de uso: Es común que las funciones que devuelven punteros 
devuelvan un puntero nulo en caso de fallo.

char* p = malloc(5); //Reservar 5 bytes
if (!p) { //Es el puntero nulo: No se pudieron reservar
puts("No se pudieron reservar");
}

if (p) { //Apunta a una posición de memoria
  p[0] = 'A'; //Si p fuera un puntero nulo estas operaciones darían una 
excepción
  p[1] = 'B';
  p[2] = '\0';
  puts(p);
}

Puedes probar a cambiar malloc(5) por malloc(999999999999) para que la 
petición de memoria falle (le pides demasiada).
>
> Muchas gracias y un saludo, Alejandro.
>
De nada




Más información sobre la lista de distribución Cconclase