LOGO
PUNTEROS
Como una colección de posiciones de
memoria consecutivas . En ella se
almacenan los distintos tipos de
datos, que ocupan, por ejemplo:
1 char = 1 byte
1 int = 2 bytes
1 float = 4 bytes
75
0x4fffd34
n
int
¿Cómo se organiza la memoria asociada a un programa?
Atributos fundamentales
asociados a la declaración de
una variable
LOGO
PUNTEROS
Un puntero no es más que una variable estática cuyo contenido es una dirección de memoria.
LOGO DIRECCIONES Y REFERENCIAS
&: me da la dirección de un objeto en la memoria.
Sólo sirve para posiciones de memoria (puede apuntar a variables o a vectores, pero no a constantes o expresiones).
Al valor de una variable se accede por medio de su nombre.
A la dirección de una variable se accede por medio del “operador de dirección &”
Ejemplo: para imprimir la dirección de n: cout << &n;
LOGO
Ejemplo:
Obtener el valor y la dirección de una variable.
void main() { int n = 75; printf(“n = %d \n\n”, n); // Visualiza el valor de n printf(“&n = %p \n\n”, &n); // Visualiza la dirección de n }
Ejecución:
n = 75 &n = 0x4fffd34
DIRECCIONES Y REFERENCIAS
LOGO
PUNTEROS
REGLAS BÁSICAS DE
PUNTEROS:
• Un puntero es una
variable como cualquier
otra.
• Una variable puntero
contiene una dirección
que apunta a otra
posición en memoria.
• En esa posición se
almacenan los datos a los
que apunta el puntero.
• Un puntero apunta a una
variable de memoria.
75
p
El valor de un puntero es una dirección. La
dirección depende del estado de la
computadora en la cual se ejecuta el
programa
Puntero: Tipo de variable que almacena una dirección.
LOGO
PUNTEROS
A
101
100
99
1001
1000
999
p contiene el valor 100, que es
la dirección de alfa.
*p es el valor del elemento al
que apunta p. Por consiguiente,
*p toma el valor ‘A’.
Dirección de
memoria alta
Dirección de
memoria baja Relaciones entre *p y el valor
de p (dirección de alfa)
alpha
p
LOGO
DECLARACIÓN DE PUNTEROS
TIPO * nombre_puntero ;
Donde TIPO es cualquier tipo definido. Así, un puntero a caracter se
declararía de la siguiente forma:
char *pchar;
Diferencia entre “*” y “&”:
En C se puede obtener directamente
la dirección de memoria de cualquier
variable. Esto es posible hacerlo con
el operador unario “&” así:
char a; /* Variable a de tipo char */
printf(“La dirección de memoria de
‘a’ es: %p \n”, &a);
Y para obtener lo apuntado por un puntero se
utiliza el operador unario “*” de esta forma:
char a; /* Variable a de tipo char */
char *pchar; /* Puntero a char ‘pchar’ */
pchar = &a; /* ‘pchar’ <- @ de ‘a’ */
printf(“La dirección de memoria de ‘a’ es: %p
\n”, &a);
printf(“Y su contenido es: %c \n”, *pchar);
LOGO
PUNTEROS
Ejercicio:
Ejecución:
N = 75, &n = 0x4fffd34, p = 0x4fffd34
&p = 0x4fffd10
0x4fffd34
0x4fffd30
p
75
0x4fffd34
n
Int*
Int
void main()
{
int n = 75;
int *p = &n;
printf("n = %d \n",n); //con el nombre de la variable se puede obtener si valor
printf("&n = %p \n",&n); //con el operador de referencia & se obtiene la dirección de memoria de n
printf("&n = %p \n",p); //p contiene la dirección de memoria donde esta n
printf("&p = %p \n\n",&p); //con el operador de referencia se obtiene la dirección de memoria de p
printf("n = %d \n\n",*p); // *p permite obtener el datos guardado en la variable apuntada n
system("pause");
}
LOGO PASO DE PUNTEROS A UNA FUNCIÓN
• En C, el método normal de pasar argumentos a
funciones es a través de parámetros por valor.
• Cuando se pasa un argumento como un valor a una función, se hace una copia del elemento de dato dentro de la función.
• Dentro de la función, todas las referencias a los argumentos a través de los parámetros formales son dirigidos a la copia.
• De manera que, si se modifica este elemento de dato, es la copia dentro de la función la que es modificada y no la usada en la llamada.
LOGO PASO DE PUNTEROS A UNA FUNCIÓN
Los Punteros
permiten representar el paso de parámetros
de una función por referencia.
Cuando un puntero se usa como argumento, ofrece el acceso y la capacidad de alterar
las variables globalmente desde
alguna función.
LOGO PUNTEROS: Reglas de uso.
• El símbolo * se usa para DEFINIR un tipo puntero. • El símbolo & se usa para indicar la dirección de una
variable. • El símbolo * se usa para ACCEDER al valor de un
puntero. • El símbolo & se usa en la invocación de funciones, de
forma que se coloca delante de los parámetros de E/S. • Cuando un parámetro es de E/S en el prototipo y cabecera
se indica con un tipo puntero, esto es, colocando 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. • Los * sólo se usan en las funciones.
LOGO ARRAYS UNIDIMENSIONALES
¿Qué es un Array
(Arreglo)?
Es una colección de datos del
mismo tipo que se referencian
por un mismo nombre, sus
elementos se distinguen entre
sí, por índices o direcciones de
memoria.
¿Cómo acceder a un
elemento de un Array?
A un elemento específico de
un arreglo se accede
mediante índices o su
dirección de memoria. La
dirección más baja
corresponde al primer
elemento y la dirección más
alta al último elemento.
LOGO
0 1 2 3 4 5 6 7 8 9
EF00 EF02 EF04 EF06 EF08 EF10 EF12 EF14 EF18 EF20
Un arreglo unidimensional es una colección de datos del mismo tipo
almacenados en posiciones contiguas de memoria.
Declaración: tipo nombre_arreglo[tamaño] ;
Donde:
• tipo: declara el tipo del arreglo, que es el tipo de cada elemento del mismo.
• nombre_arreglo: es el nombre del arreglo.
• tamaño: es el número de elementos del arreglo.
Ejemplo:
int lista[10]; //Declara un arreglo lista con 10 elementos de tipo int.
ARRAYS UNIDIMENSIONALES
30 15 27 39 43 51 66 25 84 18 lista
Dirección memoria
Elementos
Índice
LOGO ARRAYS UNIDIMENSIONALES
0 1 2 3 4 5 6 7 8 9
EF00 EF02 EF04 EF06 EF08 EF10 EF12 EF14 EF18 EF20
30 15 27 39 43 51 66 25 84 18 lista
Dirección memoria
Elementos
Índice
Índice:
Identifica la posición del elemento en el arreglo. También se le
conoce como subíndice. Deben ser enteros: constantes, variables o
expresiones. El primer valor comienza generalmente por 0.
Los elementos del arreglo lista del ejemplo serían:
Lista[0] = 30 primer elemento del arreglo
Lista[1] = 15 segundo elemento del arreglo
…….. ….
Lista[9] = 18 último elemento del arreglo
LOGO
• La declaración de los arreglos puede ser de cualquier tipo de datos.
Por ejemplo:
int patos[22]; /*arreglo de 22 enteros*/
char alfabeto[26]; /*arreglo de 26 caracteres*/
long int grados [500]; /*arreglo de 500 enteros largos*/
• También se pueden usar constantes para la declaración de un
arreglo. Ejemplos:
#define TAM 15
int a[TAM];
char b[TAM+1];
float c[TAM-1];
• La cantidad de memoria necesaria para almacenar un arreglo está
directamente relacionada con el tamaño y el tipo del arreglo.
Total_bytes=sizeof(tipo)*tamaño
ARRAYS UNIDIMENSIONALES
LOGO ARRAYS UNIDIMENSIONALES
Inicialización de Arrays:
• Los arrays se inicializan en el momento de declararlos.
• La forma general de inicialización de un array es similar a la de otras
“variables”, así:
tipo nombre_array[tamaño] = {lista_valores};
donde: lista_valores es una lista de constantes separadas por
comas, cuyo tipo es compatible con tipo.
Ejemplo: int lista[10] = {34,15,7,9,3,11,6,25,4,18};
• La primera constante se coloca en la primera posición del array, la
segunda constante se coloca en la segunda posición, y así
sucesivamente.
LOGO PUNTEROS Y ARRAYS UNIDIMENSIONALES
Los programas que utilizan punteros son más eficientes porque
los punteros usan directamente las direcciones de
memoria.
En particular, los punteros hacen más rápido el trabajo de los arrays. Entonces,
la notación con arrays es un método
disfrazado de empleo de punteros.
El nombre de un array sin índice y sin corchetes es un puntero dirigido al primer elemento del array…
LOGO PUNTEROS Y ARRAYS UNIDIMENSIONALES
Por ejemplo, con las siguientes declaraciones:
int meses[12];
int *p;
• Se puede generar un puntero al primer elemento, usando el nombre del
array meses así:
p=meses;
Por lo tanto, se cumple que:
p==&meses[0]
• Es cierto, y los punteros meses y &meses[0] representan la dirección de
memoria del primer elemento del array.
• Además, los punteros meses y &meses[0] son constantes y no pueden
cambiar su valor a lo largo del programa, porque indican dónde comienza a
almacenarse el array. Sin embargo, pueden ser asignados a una “variable
puntero” como p.
LOGO PUNTEROS Y ARRAYS UNIDIMENSIONALES
El lenguaje C proporciona dos métodos de acceso a elementos de arrays, que son:
Aritmética de punteros
Indexación del array
ÍNDICES
PUNTEROS
Con el array meses Con el puntero p
Primer elemento
meses[0] *meses *p
Segundo elemento
meses[1]
*(meses+1) *(p+1)
Tercer elemento
meses[2]
*(meses+2) *(p+2)
… … … …
Duodécimo elemento
meses[11]
*(meses+11) *(p+11)
Top Related