Вы находитесь на странице: 1из 18

ARRAYS DE PUNTEROS

Si se necesita reservar muchos punteros a muchos valores diferentes, se puede declarar un


array de punteros es array que contiene como elementos punteros, cada uno de
cuales apunta un tipo de dato específico. La línea siguiente reserva array de diez variables puntero
a enteros:

La Figura muestra cómo C organiza este array. Cada elemento contiene una dirección que
a otros valores de memoria. Cada valor apuntado debe ser entero. Se puede asignar
elemento de una dirección, tal como para variables puntero no arrays. por ejemplo,

Otro ejemplo de arrays de punteros, en este caso de caracteres es:

De igual forma, se podría declarar puntero a array de punteros a enteros.


*

las operaciones paso paso son:

Una matriz de número enteros, reales, puede verse como array de punteros; de tantos elementos
como filas tenga la matriz, apuntando cada elemento del array array de enteros reales, de tantos
elementos como columnas.
10.6.1. Inicialización de un array de punteros a cadenas
La inicialización de array de punteros a cadenas se puede realizar con una declaración similar a ésta:

Ago

10.7. PUNTEROS DE CADENAS


punteros se pueden utilizar en lugar de índices de arrays. Considérese la siguiente declaración de
array de caracteres que contiene las veintiséis letras del alfabeto internacional (no se considera la

Declaremos ahora puntero a char

Se establece que apunta al primer carácter de escribiendo

de modo que si escribe la sentencia

se visualiza la letra ya que apunta al primer elemento de la cadena. Se puede hacer también
p
de modo que apuntará al carácter (la letra Sin embargo, no se puede hacer
p
ya que es array cuyos elementos son de tipo se produciría error al compilar
(tipo de asignación es incompatible).

Figura 10.7. puntero

Es posible, entonces, considerar tipos de definiciones de cadena:

10.7.1. Punteros versus arrays


El siguiente programa implementa una función para contar el número de caracteres de una cadena. En
el primer programa, la cadena se describe utilizando array, en el segundo, se describe utilizando
puntero.
El segundo programa utiliza un puntero para la función que cuenta caracteres de la cadena.
Además, utiliza la aritmética de punteros para indexar caracteres. El bucle termina cuando llega
último carácter, que es el delimitador de una cadena:

En ambos casos se imprimirá:

DE PUNTEROS
Al contrario que nombre de array, que es un puntero constante no se puede modificar, puntero
es una variable que se puede modificar. Como consecuencia, se pueden realizar ciertas operaciones
aritméticas sobre punteros.
A un puntero se le puede sumar restar un entero esto hace que apunte posiciones adelante,
atrás de la actual. Una variable puntero puede modificarse para que contenga una dirección de memoria
n posiciones adelante atrás. Observe el siguiente fragmento:

A una variable puntero se le puede aplicar el operador el operador Esto hace que contenga
la dirección del siguiente, anterior elemento. Por ejemplo:

Recuérdese que un puntero es una dirección, por consiguiente, sólo aquellas operaciones de «sentido
son legales. tiene sentido, por ejemplo, sumar restar una constante de coma flotante.

punteros
se pueden sumar dos punteros.
No pueden multiplicar dos punteros.
pueden dividir dos punteros.

Si apunta a la letra A en se escribe

entonces apunta a la letra


Se puede utilizar esta técnica para explorar cada elemento de sin utilizar una variable de
índice. Un ejemplo puede ser

Las sentencias del interior del bucle se pueden sustituir por

El ejemplo anterior con el bucle puede ser abreviado, haciendo uso de la característica de
nulo al final de la cadena. Utilizando la sentencia para realizar el bucle poniendo
la condición de terminación de nulo byte cero al final de la cadena. Esto elimina la necesidad del bucle
variable de control. El bucle se puede sustituir por

mientras que toma un valor de carácter distinto de cero, el bucle se ejecuta, el carácter se
imprime se incrementa para apuntar al siguiente carácter. Al alcanzar el byte cero final de la
cadena, toma el valor de cero. El valor cero hace que el bucle termine.
Una aplicación de punteros: conversión de caracteres
El siguiente programa muestra puntero que recorre una cadena de caracteres convierte cualquier
carácter en minúsculas a caracteres mayúsculas.

Obsérvese que si el carácter leído está en el rango entre es decir, una letra minúscula,
asignación

se ejecutará, restar 32 del código de una letra minúscula convierte a esta letra en mayúscula).
PUNTEROS CONSTANTES FRENTE A PUNTEROS A CONSTANTES

Ya está familiarizado con punteros constantes, como es el caso de nombre de array. Un puntero
constante es puntero que no se puede cambiar, pero que datos apuntados por el puntero pueden
ser cambiados. Por otra parte, puntero a una constante se puede modificar para apuntar a una
constante diferente, pero los datos apuntados por el puntero no se pueden cambiar.

Punteros constantes

Para crear puntero constante diferente de nombre de array, se debe utilizar el siguiente formato:

Como ejemplo de una definición de punteros de constantes, considérense las siguientes sentencias:

es un puntero de constantes que apunta a por que es una constante, pero es una variable.
Por consiguiente, se puede cambiar el valor de pero no
Por ejemplo, la siguiente asignación es legal, dado que se cambia el contenido de memoria a donde
apunta pero no el puntero en

Por otra parte, la siguiente asignación no es legal, ya que se intenta cambiar el valor del puntero

El sistema para crear puntero de constante a una cadena es:

no se puede modificar para apuntar a una cadena diferente en memoria. Por consiguiente,

es legal, ya que se modifica el dato apuntado por nombre (cambia el primer carácter). Sin embargo,

dado que se intenta modificar el propio puntero

Punteros a constantes

El formato para definir puntero a una constante es:

Algunos ejemplos:

50;
en los que se define como un puntero la constante datos son constantes no el puntero; en
consecuencia, se puede hacer que apunte a otra constante.

Sin embargo, cualquier intento de cambiar el contenido almacenado en la posición de memoria a


donde apunta creará error de compilación. la siguiente sentencia no se compilará
correctamente:

Una definición de un puntero constante tiene la palabra reservada delante del nombre del
puntero, mientras que el puntero a una definición constante requiere que la palabra reservada
se sitúe antes del tipo de dato. Así, la definición en el caso se puede leer como
«punteros constante de constante», mientras que en el segundo la definición «puntero
a tipo constante de dato».

La creación de puntero a una constante cadena se puede hacer del modo siguiente:

En el prototipo de la siguiente función se declara el argumento como puntero a una constante:

Punteros constantes a constantes


El último caso a considerar es crear punteros constantes a constantes utilizando el formato siguiente:
const

Esta definición se puede leer como tipo constante de dato puntero Un ejemplo
puede ser:

que indica: es un puntero constante que a la constante entera Cualquier intento


modificar bien producirá un error de compilación.

Regla
Si sabe que un puntero siempre apuntará a la misma posición nunca necesita ser reubicado
(recolocado), como un puntero constante.
Si sabe que el dato apuntado por el puntero nunca necesitará cambiar, defina el puntero como
un puntero a una constante.
Un puntero a una constante diferente un puntero constante. ejemplo muestra las
diferencias.

en blanco es significativo en la de punteros.


son equivalentes:

PUNTEROS COMO ARGUMENTOS DE FUNCIONES

Con frecuencia se desea que una función calcule devuelva más de valor, bien se desea que una
función modifique variables que se pasan como argumentos. Cuando se pasa una variable a una
función por valor) no se puede cambiar el valor de esa variable. Sin embargo, si se pasa un puntero
una variable una función por se puede cambiar el valor de variable.
Cuando una variable es local a una función, se puede hacer variable visible a otra función
pasándola como argumento. Se puede pasar puntero a una variable local como argumento cambiar
la variable en la otra función.
Considere la siguiente definición de la función que incrementa entero en

La llamada esta función se realiza pasando una dirección que itilice esa función. Por ejemplo,
para llamar a la función utilice:
posible mezclar paso por referencia por valor. Por ejemplo, la función definida como

la invocación a la función podría ser:

Cuando se retorna de la función tras ejecución, será igual a seguirá siendo


que se pasó por valor. El paso de un nombre de array a una función es lo mismo que pasar puntero
al array. Se pueden cambiar cualquiera de los elementos del array. Cuando se pasa un elemento a
función, sin embargo, el elemento se pasa por valor. En el ejemplo
2,

ambos elementos se pasan por valor.

En por defecto,el paso de parámetros se hace por valor. no tiene por referencia,
hay que emularlo mediante el paso de dirección de una variable, utilizando punteros en
argumentos de la función.

En el siguiente ejemplo, se crea una estructura para apuntar las temperaturas más alta más baja de
un día determinado.

caso típico podría ser almacenar las lecturas de termómetro conectado de algún modo posible
a una computadora. Una función clave del programa lee la temperatura actual modifica el miembro
adecuado, en una estructura de la que se pasa la dirección del argumento
a parámetro puntero.

La llamada a la función se puede hacer con estas sentencias:


10.1 PUNTEROS FUNCIONES
Hasta este momento se han analizado punteros a datos. posible declarar punteros a cualquier tipo de
variables, estructura array. De igual modo, las funciones pueden declarar parámetros punteros para
permitir que sentencias pasen las direcciones de argumentos a esas funciones.
Es posible también crear punteros que apunten a funciones. En lugar de direccionar datos, los
punteros de funciones apuntan a código ejecutable. Al igual que los datos, las funciones se almacenan
en memoria tienen direcciones iniciales. En se pueden asignar las direcciones iniciales de funciones
a punteros. Tales funciones se pueden llamar en modo indirecto, es decir, mediante un puntero cuyo
valor es igual a la dirección inicial de la función en cuestión.
La sintaxis general para la declaración de puntero a una función es:

Este formato indica cornpilador que es un puntero a una función que devuelve
tipo tiene una lista de parámetros.
Un puntero a una función es simplemente un puntero cuyo valor es la dirección del nombre de la
función. Dado que el nombre es, en sí mismo, un puntero; un puntero a una función es un puntero a
puntero constante.

Figura a
Por ejemplo:

El primer identificador, apunta a una función que devuelve un tipo tiene Único
parámetro de tipo El segundo puntero, apunta a una función que devuelve tipo
acepta dos parámetros de tipo . El tercer puntero, es un puntero a una función que
devuelve tipo toma dos parámetros: puntero a tipo Por Último,
es puntero a una función que devuelve tipo tiene tres parámetros: un
un puntero a

Inicialización un puntero a una función


La sintaxis general para inicializar puntero una función es:
La función asignada debe tener el mismo tipo de retorno lista de parámetros que el puntero
función; en caso contrario, se producirá error de compilación. por ejemplo, un puntero a una
función double:

Algunas de las funciones de la biblioteca, tales como requiere pasar un argumento


consta de un puntero a una función. Se debe pasar a un puntero de función que apunta a
función.

Se desea ordenar un array de números reales, la ordenación se va a realizar con .


Esta función tiene un que es puntero a función del tipo
Se necesita un función de comparación, que devuelva negativo si primer argumento es menor
que el segundo, si son iguales positivo si es mayor. continuación se escribe el programa:
Supongamos un puntero a unafunción tul como

a continuación se puede asignar la dirección de lafunción

al puntero escribiendo

Después de esta asignación se puede escribir la siguiente llamada a la función:

efecto es el mismo que

También se puede omitir el asterisco como paréntesis) en la llamada


convirtiéndose en esta otra llamada.

La utilidad de a punteros se ve más claramente si se imagina programa grande,


principio del cual se desea elegir una entre varias funciones, de modo que la función elegida se llama,
entonces, muchas veces. Mediante un puntero, la elección sólo se hace una vez: después de asignar (la
dirección de) la función seleccionada a un puntero a continuación se puede llamar través de ese
puntero.
punteros funciones también permiten pasar una como un argumento a otra función.
Para pasar el nombre de una función como argumento función, se especifica el nombre de la función
como argumento. Supongamos que se desea pasar función a función El
código siguiente realiza las tareas anteriores:

En la función llamada se declara la función pasada como puntero función.


Como ejemplo practico veamos cómo escribir una función general que calcule la suma de algunos
valores, es decir,

para cualquier función que devuelva el tipo con un argumento . Diseñaremos una
función que tiene dos argumentos: el número de términos de la suma, la función
utilizada. pues, la función se va a llamar dos veces, va a calcular la suma de
2,

El programa siguiente muestra la función que utiliza la función en un caso para


inversos en para cuadrados.

El programa anterior calcula las sumas de

salida será:
Suma
10.1 Aplicación de punteros a función para ordenación

Algunas de funciones de la biblioteca, tal como requieren pasar


argumento que consta de un puntero a una función. Se debe pasar a ambas,
puntero de función que apunta hacia una función que se debe definir. utiliza el algoritmo de
ordenación rápida para ordenar array de cualquier tipo de dato. utiliza la
búsqueda binaria para determinar si elemento está en un array. La función que debe de proporcionarse
es para realizar comparaciones de elementos de array. En el programa siguiente, la función
se pasa a a La función compara entradas del array
devuelve (retorna) un número negativo si es menor que devuelve cero si son iguales,
número positivo si es mayor que
programa siguiente ordena de números enteros busca si existe un valor clave.

de
Los de la función y son:
Dirección de la clave a buscar.
Array que contiene valores a ordenar.
Número de elementos del
en bytes de cada elemento del array.
Nombre de la función que compara dos elementos del array.

1.3. Arrays de punteros de funciones

Ciertas aplicaciones requieren disponer de numerosas funciones, basadas en el cumplimiento de ciertas


condiciones. método para implementar aplicación es utilizar una sentencia con muchos
selectores Otra solución es utilizar un array de punteros de función. Se puede seleccionar
función de la lista llamarla.
La sintaxis general de array de punteros de función es:

apunta a array de funciones; cada miembro devuelve valor tiene único parametro
de tipo es puntero a array de funciones; cada miembro devuelve tipo
toma dos parámetros: puntero a gned

nombre de un elemento.
es un array.
es un array de punteros.
es un array de punteros a funciones.
es un array de punteros a funciones que devuelven valores

Se puede asignar la dirección de las funciones al array, proporcionando las funciones que ya han sido
declaradas. ejemplo es

{funcl,
10.11.4. Una aplicación de punteros de funciones

El listado siguiente, A c es programa que simula calculador que puede sumar, restar,
multiplicar dividir números. Se escribe una expresión simple por teclado el programa visualiza la
respuesta.
El programa define cuatros funciones: un array de
punteros a función que se inicializa a cada una de las funciones. Se pide la operación a realizar, se
busca el índice del puntero a función que le corresponde (dependiendo del operador) se realiza la
llamada a la función con puntero.
PUNTEROS A ESTRUCTURAS

Un puntero también puede apuntar a una estructura. Se puede declarar puntero a una estructura tal
como se declara un puntero a cualquier otro objeto se declara puntero estructura tal como se declara
cualquier otra variable estructura: especificando puntero en lugar del nombre de la variable estructura.

Cuando se referencia miembro de la estructura utilizando el nombre de la estructura, se especifica


la estructura el nombre del miembro separado por punto Para referenciar el nombre de
persona, utilice Se referencia una estructura utilizando el puntero estructura.
utiliza el operador para acceder a miembro de ella.

Ejemplo
En este ejemplo se declara tipo estructura que se asocia con el tipo para
facilidad de escritura. Un array de esta estructura con campos al azar muestran por
pantalla.
Al ejecutar este programa se visualiza la salida siguiente:
47

punteros son una de las herramientas más Para obtener la dirección de una variable
cientes para realizar aplicaciones en Aunque su existente, se utiliza operador de dirección
práctica puede resultar difícil y tediosa es, sin lugar a
dudas, una necesidad vital su aprendizaje si desea Se debe declarar un puntero antes de su uso.
obtener el máximo rendimiento de sus programas.
En este capítulo habrá aprendido los siguientes Un puntero es un punteroque no se asig
conceptos: na a un tipo de dato especifico y puede, por
consiguiente, utilizarse para apuntar a tipos de
Un puntero es una variable que contiene la datos diferentes en diversos lugares su pro
dirección de una posición en memoria. grama.
Para declarar un puntero se sitúa un asterisco Para inicializar un puntero que no apunta a
entre el tipo de dato y el nombre de la variable, nada, se utiliza la constante
como en
Estableciendo puntero la direccióndel pri
Para obtener valor almacenado en la direc mer elemento de un array, se puede utilizar
ción utilizada por el puntero, se utiliza el ope puntero para acceder a cada elemento del array
rador de indirección .El valor de es una de modo secuencial.
dirección de memoria el valor de es el
dato entero almacenado en esa dirección de Asi mismo, se han estudiado conceptos de
memoria. aritméticade punteros, punteros a funciones, punteros
a estructuras arrays punteros.

Вам также может понравиться