Punteros y arrays en C

– Prog106

/* Prog106.cpp */

#include <stdio.h>
void main()
{
int i,t[5],*pun;
for(i=0;i<5;i++) t[i]=i;
printf(«n Listado del array: n»); for(i=0;i<5;i++) printf(«n%d»,t[i]); printf(«n Listado del array, pero a través de punteros: n»); for(i=0;i<5;i++)
{
pun=t+i;
printf(«%dn»,*pun);
}
}

Estudio del PROG106:

x El nombre de un array (t, en nuestro caso) es sinónimo de la dirección de memoria del primer byte de sus elementos. Por lo tanto: pun=t+i al variar i= 0, 1, 2, 3, 4 no es más que las direcciones de memoria de los 5 valores del array.

– Prog107

/* Prog107.cpp */

#include <stdio.h>
void main()
{
int i,t[5],*pun;
for(i=0;i<5;i++) t[i]=i;

– Prog108

/* Prog108.cpp */

#include <stdio.h>

void main()

{
int i,j,mat[5][5]; for(i=0;i<5;i++)

for(j=0;j<5;j++)
mat[i][j]=5*i+j; printf(«n Listado de la matriz:n»); for(i=0;i<5;i++)

for(j=0;j<5;j++) printf(«%d-«,mat[i][j]);
printf(«n Listado de la matriz pero utilizando punteros: n»);
for(i=0;i<5;i++)
{
for(j=0;j<5;j++) printf(«%d-«,*(*(mat+i)+j));
printf(«n»);
}
}

Compara el PROG106 y el PROG108, parecen complicados ¿verdad?. Ciertamente que sí, pero debes tener en cuenta las siguientes reglas:

1) El nombre de un array unidimensional es un sinónimo de la dirección de memoria de su primer byte.

2) El contenido del elemento “i” de un array unidimensional de nombre “pepe” se obtiene como *(pepe+i) 

3) Una tabla bidimensional no es sino una matriz unidimensional cuyos elementos son, a su vez, arrays unidimensionales.

– Prog109

/* Prog109.cpp */

#include <stdio.h>
float invertir(float *numero);
void main()
{
float i;
printf(«n Escribe un número:  «); scanf(«%f»,&i);
if (invertir(&i) != 0) printf(«n El inverso es %f»,i); else printf(«n No tiene inverso»);
}
float invertir(float *numero)
{
if(*numero==0) return 0;
else
{
*numero=1/(*numero); return *numero;
}
}

– Prog110

/* Prog110.cpp */
/* Ejemplo de funciones por valor y por referencia (dirección de memoria) */
/* Calcula dos veces el procentaje de gastos, la primera vez utilizando una función por valor y la segunda por referencia (punteros) */

#include<stdio.h>
#include <conio.h>
void porcentaje_xvalor(float ingreso, float egreso);
void porcentaje_xref(float *ingreso,float *egreso);
void main()
{
float entrada,salida; clrscr();
printf(«Entradas: «); scanf(«%f»,&entrada);
printf(«Salidas: «); scanf(«%f»,&salida); porcentaje_xvalor(entrada,salida); /*Llamada a la función porcentaje
utilizando paso de parámetros  por valor*/
printf(«nn»);
porcentaje_xref(&entrada,&salida); /*Utilización de la función porcentaje
con paso de parámetros por referencia*/
getch();
}
void porcentaje_xvalor(float ingreso, float egreso)
{
egreso=((egreso/ingreso)*100);
printf(«Usted gasta el %.2f por ciento de lo  que gana»,egreso);
}
void porcentaje_xref(float *ingreso,float *egreso)
{
*egreso=(((*egreso)/(*ingreso))*100);
printf(«Usted gasta el %.2f por ciento de lo  que gana»,*egreso);
}

Fuente: Programación en C/C++ (Manual FV) de Fermí Vilà