Ing. Carlos Ávila M. Jr.
http://www.elrincondelc.com/cursoc/cursoc.html
Un Puntero es una variable que contiene la dirección de
otra variable
Cuando una variable puntero es definida, el nombre de la
variable debe ir precedido de un asterisco (*). Este
identifica que la variable es un puntero. Las variables
cuando la definimos reservan un espacio de memoria, la
zona de memoria en dónde se guarda esa variable es la
que llamamos un puntero.
Tipo *identificador
Por ejemplo:
int *p
; es una variable puntero de tipo
entero. La variable p es la dirección de memoria en dónde
se guarda un entero.
Operadores
El * tiene dos usos en C
o
Para declarar variable de tipo puntero
o
Para acceder al contenido de lo que está
dentro de esa dirección
o
El operador & delante de una variable
devuelve la dirección de memoria en
dónde se guarda esa variable.
Ejemplo
#include <stdio.h>
#include <iostream>
#include “funciones.h”
using namespace std;
void main (void){
int a=7, b=8;
printf(“a=%d b=%d\n”,a,b);
intercambia (a, b);
printf(“a=%d b=%d\n”,a,b);
}
void intercambia (int x, int y){
int z;
z=x;
x=y;
y=z;
}
--- Solución
No ocurre
el cambio
*x e *y son
variables de tipo
puntero.
Hay que modificar la función
intercambia (&a, &b);
void intercambia (int *x, int *y){
int z;
z=*x;
*x=*y;
*y=z;
}
Resumen
El símbolo * se usa para DEFINIR un tipo de puntero
*: acceso al contenido
&: acceso al contenido
Otro significado del *
Guarda en Z el contenido de X
Otro significado del *
Guarda en Z el contenido de X
El símbolo & se usa para indicar la dirección de una
variable
El símbolo *se usa para ACCEDER al valor que guarda un
puntero
El símbolo & se usa para la invocación de funciones, de
forma que se pone delante de los parámetros de E/S
Cuando un parámetro es el prototipo y cabecera se indica
con un tipo de puntero, esto es, poniendo un * delante del
nombre
En el cuerpo de la función los argumentos que son
funciones se usan con un * delante.
Los & sólo se usan en el programa principal
Capitulo 1
Funciones
Introducción
La solución de un problema se expresa por medio de un programa; la
solución de un subproblema, por medio de una función.
La comunicación entre las funciones y el programa principal, al igual que
entre las mismas funciones, se lleva a cabo por medio de
parámetros por
valor, parámetros por referencia y variables globales.
Variables locales, globales y estáticas
Las variables
son objetos que pueden cambiar su valor durante la
ejecución de un programa.
En C podemos distinguir tres tipos de variables:
Locales
,
Globales
y
Estáticas
.
Las variables locales
son objetos definidos tanto en el programa
principal como en las funciones y su alcance esta limitado
solamente al
programa principal
o a la
función
en la cual están
definidas. Por ejemplo,
cada variable local definida en una función
comienza a existir solo cuando se llama a esa función
y
desaparece cuando el control regresa al programa principal
.
Puesto que no retienen su valor, deben ser inicializada cada vez que
se ejecuta la función, de otra manera contendrán basura.
Las variables globales
son objetos definidos
antes del programa
principal y su alcance es muy amplio ya que tiene influencia tanto
en el programa principal como en todas las funciones
.
Las variables estáticas
son
similares a las locales
pero conservan
su valor durante la ejecución del programa. Es decir, comienzan a
existir cuando se llama a la función y conservan su valor aun
cuando el control regresa al programa principal
.
En lenguaje en C una función se escribe de la siguiente forma:
Tipo-de-resultado
Nombre de la función
(Parámetros)
{
Instrucciones
;
}
Donde:
Tipo-de-resultado
representa el tipo de resultado que
devuelve la función
(entero,
real, carácter, cadena de
caracteres, etc); si no regresa ningún resultado, entonces se
escribe la palabra reservada
void
.
Parámetro
se utiliza para indicar la lista de parámetros que
recibe la función.
Instrucciones
representan el conjunto de instrucciones que
pertenecen a la función.
Ejemplos
#include <stdio.h>
int cubo (void); /*prototipo de la función*/
int I; /*variable global*/
void main (void)
{
int CUB;
for ( I=1; I <=10; I++)
{
CUB = cubo(); /* llamada a la función cubo */
printf (*\n el cubo de %d es: %d , I, CUB);
}
}
int cubo (void) /*declaración de la función*/
/*la función calcula el cubo de la variable global I.*/
{
return (I*I*I);
}
OBS:
La segunda instruccion del programa:
int cubo (void);
es un prototipo de la función. Puesto que
esta función se declara posteriormente, pero se utiliza en el
programa principal, el compilador del lenguaje C requiere
estar enterado de la existencia de la misma.
El tipo de la función es entero (int) y no tiene parámetros. Las
funciones pueden regresar resultados de diferentes tipos de
Return regresa el
resultado obtenido al prog principal. siempre que la función es de un tipo de dato determinado. También regresa el control al prog. Principal.
Return regresa el
datos o bien no regresar ninguno, en cuyo caso al inicio se
debe incluir la palabra
void
.
La instrucción
CUB = cubo();
Expresa que el resultado de la función cubo () se asigna a la
variable local CUB. Observa la forma de invocar o llamar a
una función. Cabe destacar que es posible evitar el uso de la
variable local CUB escribiendo el resultado del llamado a la
función cubo como se muestra a continuación.
printf
(*\n El cubo de %d es: %d , I, cubo());
Finalmente, ya en la función cubo, la instrucción:
return (I * I * I);
return regresa el resultado obtenido al programa principal.
Siempre que la función sea de un tipo de datos determinado
es necesario utilizar
return
para regresar tanto el resultado
como el control al programa principal
.
Ver el resultado de la función en el libro.
Programa 4.2:
El programa calcula el cubo de los 10 primeros números
naturales con la ayuda de una función.
#include <stdio.h>
int cubo (void); /*prototipo de la función*/
int I; /*variable global*/
void main (void)
{
int CUB;
{
CUB = cubo(); /* llamada a la función cubo */
printf (*\n el cubo de %d es: %d , I, CUB);
}
}
int cubo (void) /*declaración de la función*/
/*la función calcula el cubo de la variable local I.*/
{
int I = 2;
/*la variable local entera I con el mismo nombre que la variable
global.*/
return (I*I*I);
}
OBS:
la
variable local I tiene prioridad sobre la variable global que
tiene el mismo nombre y por esa razón siempre calcula el cubo del
número entero 2.
Conflicto entre los nombre de las variables
Las variables locales, tienen prioridad sobre las globales
que
cuentan con el mismo nombre. En caso que necesitemos hacer
referencia a la variable global debemos incorporarle previamente a
la variable global el símbolo
::,
de tal forma que si queremos hacer
referencia a la variable global I, debemos escribir :
::I.
Programa 4.3:
El programa calcula el cubo de los 10 primeros números
naturales con la ayuda de una función.
#include <stdio.h>
#include <windows.h>
void f1 (void); /*prototipo de la función*/
int k=5; /*variable global*/
void main (void)
{
int I;
for ( I=1; I <=10; I++)
f1(); /*llamada a la función f1*/
}
void f1 (void)
/*la función utiliza tanto la variable local I como la variable
global.*/
{
int k = 2; /* variable local */
k +=k;
printf (“\n\n El valor de la variable local es: %d”,k);
::k = ::k + k; /* uso de ambas variable */
printf (“\n El valor de la variable global es: %d”,::k);
fflush(stdout);
system("pause");
}
Los resultados que arroja el programa son los siguientes:
El valor de la variable local es: 4
El valor de la variable global es: 17
Ejemplo 4.4
Observa el uso de las variables locales, globales y estáticas. Incluso en la función f4 se hace referencia tanto a la variable local como a la variable global que tiene el mismo nombre.
#include <windows.h>
#include <stdio.h>
/* Prueba de variables globales, locales y estáticas.
El programa utiliza funciones en las que se usan diferentes tipos de variables */
int f1 (void);
int f2 (void);
int f3 (void);
int f4 (void); /*prototipo de la función*/
int k =3; /*variable global*/
void main (void)
{
int I;
for ( I=1; I <=3; I++)
{
printf (“\n\n El resultado de la función f1 es: %d”,f1());
printf (“\n\n El resultado de la función f2 es: %d”,f2());
printf (“\n\n El resultado de la función f3 es: %d”,f3());
printf (“\n\n El resultado de la función f4 es: %d”,f4());
system(“pause”);
} }
int f1(void) /*la función f1 utiliza la variable global.*/
k+=k;
return (k);
}
int f2(void) /*la función f2 utiliza la variable local.*/
{
k=1;
k++;
return (k);
}
int f3(void) /*la función f3 utiliza la variable estática.*/
{
static int k=8;
k+=2;
return (k);
}
int f4(void) /*la función f4 utiliza dos variables con el mismo nombre: local y global.*/
{
k=5;
k=k+::k;
return (k); /*uso de la variable local (k) y global (::k).*/
}
Los resultados que arroja el programa son los siguientes:
El resultado de la función f1 es : 6 global El resultado de la función f2 es : 2 local El resultado de la función f3 es : 10 estática El resultado de la función f4 es : 11 local y global
El resultado de la función f4 es : 17 local y global
El resultado de la función f1 es : 24 global El resultado de la función f2 es : 2 local El resultado de la función f3 es : 14 estática El resultado de la función f4 es : 29 local y global
Parámetros por valor y por referencia
La comunicación entre las funciones y el programa principal, o bien entre las mismas funciones, se lleva a cabo mediante variables globales y parámetros por valor y por referencia.
Los parámetros por valor permiten pasar datos entre el programa principal y las
funciones, e incluso entre las mismas funciones. En el parámetro se escribe una copia de la variable original. Si el parámetro sufre una alteración en la función que lo recibe, la variable original no se ve afectada.
Los parámetros por referencia diferente de la anterior en lugar de escribir una copia de la variable en el parámetro se escribe la dirección de la misma. Si el parámetro sufre una alteración en la función que lo recibe, la variable original también se ve afectada. En C, las llamadas por referencia se realizan por medio de apuntadores. Un apuntador es una variable que contiene la dirección de otra variable y se representa por medio de operadores de dirección (&) e indirección (*).
Ejemplo 4.5
Escriba un programa que calcule el cubo de los 10 primeros números naturales, utilizando una función y realizando la comunicación mediante parámetros por valor.
#include <windows.h>
#include <stdio.h>
/*Cubo-3. el programa calcula el cubo de los 10 primeros números naturales con la ayuda de una función y utilizando parámetros por valor*/
int cubo (int); /*prototipo de la función. El parámetro es por valor y de tipo entero*/
void main (void)
{
for ( I=1; I <=10; I++)
printf (“\n el cubo de %I es: %d”, cubo(I)); /* llamada de la función cubo. El paso del parámetro es por valor*/
system(“pause”);
}
int cubo (int K) /*K es un parámetro por valor de tipo entero*/
/*la función calcula el cubo del parámetro K.*/
{
return (K*K*K); /*regresa el resultado obtenido al programa principal*/
}
Los resultados que arroja el programa son los siguientes:
El cubo de I es: 1
El cubo de I es: 8
El cubo de I es: 27
El cubo de I es: 64
El cubo de I es: 125
El cubo de I es: 216
El cubo de I es: 343
El cubo de I es: 512
El cubo de I es: 729
El cubo de I es: 1000
Ejemplo 4.6
#include <windows.h>
#include <stdio.h>
/*Prueba de parámetros por referenciar*/
int f1 (int *); /*prototipo de la función. El parámetro es de tipo entero y por referencia – observa el uso del operador de indirección*/
void main (void)
{
int I, K=4;
for ( I=1; I <=3; I++)
{
printf (“\n\n valor de K antes de llamar a la función: %d”,++K);
printf (“\n\n valor de K después de llamar a la función: %d”,f1(&K)); /* llamada a la función f1. se pasa la dirección de la variable K, por medio del operador de dirección: &.*/
}
}
int f1 (int *R) /* la función f1 recibe un parámetro por referencia. Cada vez que el parámetro se utiliza en la función debe ir precedido por el operador de indirección.*/
{
Return(*R + = *R);
}
El resultado que arroja el programa es el siguiente:
Ejemplo 4.7
Analicemos a continuación el mismo programa del ejemplo anterior, pero utilizando ahora parámetros por valor en lugar de parámetros por referencia.
#include <windows.h>
#include <stdio.h>
/*Prueba de parámetros por valor*/
int f1 (int ); /*prototipo de la función. El parámetro es de tipo entero y por valor*/
void main (void)
{
int I, K=4;
for ( I=1; I <=3; I++)
{
printf (“\n\n valor de K antes de llamar a la función: %d”,++K);
printf (“\n\n valor de K después de llamar a la función: %d”,f1(K)); /* llamada a la función f1. Se pasa una copia de la variable K.*/
system(“pause”);
}
}
int f1 (int R)
{
R + = R;
return (R);
}