Documente Academic
Documente Profesional
Documente Cultură
Qu es un PUNTERO?:
Un puntero es un objeto que apunta a otro objeto. Es decir, una
variable cuyo valor es la direccin de memoria de otra variable.
No hay que confundir una direccin de memoria con el contenido
de esa direccin de memoria.
int x = 25;
Direccin
...
1502
...
25
1504
1506
...
1508
...
...
...
int *punt;
Es una variable puntero que apunta a variable que contiene un
dato de tipo entero llamada punt.
Un puntero
tiene su propia
char *car:
direccin de
Es un puntero a variable de tipo carcter.
memoria:
&punt
long float *num;
float *mat[5]; // . . .
&car
4
//salida 26.92
.printf(\n%f, *apunta);
No se debe confundir el operador
puntero:
int
Con el operador
.
* en la declaracin del
*p;
* en las instrucciones:
*p = 27;
Ver sumpun.cpp
- punt1.cpp
Es decir:
*p1 = 1;
p2 = &b;
*p2 = 2;
p1 = p2;
*p1 = 0;
// Paso 6. b = 0
10
p2 = &c;
*p2 = 3;
// Paso 8. c = 3
// Paso 9. Qu se imprime?
p = &p1;
*p = p2;
*p1 = 1;
// Paso 12. c = 1
11
12
Paso
a
0000
b
0002
c
0004
p1
0006
p2
0008
p
0010
0000
1
2
0000
0000
0002
0000
0002
0002
0000
0002
0002
0002
0004
0002
0004
0002
0004
10
0002
0004
0006
11
0004
0004
0006
12
0004
0004
0006
13
0004
0004
0006
13
Inicializacin de punteros(I):
< Almacenamiento > < Tipo >
14
Inicializacin de punteros(II):
2) El nombre de un array de almacenamiento static o extern se
transforma segn la expresin:
a) float mat[12];
float *punt = mat;
b) float mat[12];
float *punt = &mat[0];
3) Un cast puntero a puntero:
int *punt = (int *) 123.456;
Inicializa el puntero con el entero.
15
Inicializacin de punteros(III):
4) Un puntero a carcter puede inicializarse en la forma:
char *cadena = Esto es una cadena;
5) Se pueden sumar o restar valores enteros a las direcciones
de memoria en la forma: (aritmtica de punteros)
static int x;
int *punt = &x+2, *p = &x-1;
6) Equivalencia: Dos tipos definidos como punteros a objeto P y
puntero a objeto Q son equivalentes slo si P y Q son del
mismo tipo. Aplicado a matrices:
nombre_puntero = nombre_matriz;
16
PUNTEROS Y ARRAYS
Sea el array de una dimensin:
int mat[ ] = {2, 16, -4, 29, 234, 12, 0, 3};
en el que cada elemento, por ser tipo int, ocupa dos bytes de
memoria.
Suponemos que la direccin de memoria del primer elemento, es
1500:
&mat[0] es 1500
&mat[1] ser 1502
&mat[7] ser 1514
17
PUNTEROS Y ARRAYS
int mat[ ] = {2, 16, -4, 29, 234, 12, 0, 3};
En total los 8 elementos ocupan 16 bytes.
Podemos representar las direcciones de memoria que ocupan los
elementos del array , los datos que contiene y las posiciones del
array en la forma:
Direccin
1502
1504
16
-4
1506
29
1508
234
1510
12
1512
1514
Direccin
1502
1504
16
-4
1506
29
1508
1510
234
1512
12
1514
19
#include <stdio.h>
#include <conio.h>
int mat[5]={2, 16, -4, 29, 234, 12, 0, 3}, i; //declaradas como globales
void main() {
printf("\n%d", &mat[0]);
printf("\n%p", mat);
i++;
//i=1
printf("\n%p", mat+i);
printf("\n%d", *(mat+i));
getch();
20
ejemplo
16
-4
29
234
12
3
21
Direccin del
octavo elemento
16
-4
29
mat
mat+1
mat+2
mat+3
Puntero a la
direccin del
elemento 0
234
12
mat+4 mat+5
Incremento en una
unidad int (dos bytes)
0
mat+6
3
mat+7
mat++
22
23
24
25
//apunta a 0004
26
double*q;
void*r;//punterogenrico
p=&34;//lasconstantesnotienen
direccin
p=&(i+1);//lasexpresionesno
tienendireccin
&i=p;//lasdireccionesnosepueden
27
cambiar
2
*mat
mat[7] = 3
mat[1]
mat[2]
16
-4
mat[3]
29
*(mat+1) *(mat+2)
*mat = 2
mat[4]
234
*(mat+4)
*(mat+3)
mat[5]
mat[6]
12
mat[7]
*(mat+6)
*(mat+5)
*(mat+7) = 3
28
1.45
20
-23.5
2.95
-14,08
0.082
17.3
6.023
Con punteros
Valor
mat[0[[0]
*(*(mat+0)+0)
1.45
mat[0[[1]
*(*(mat+0)+1)
-23.5
mat[0[[2]
*(*(mat+0)+2)
-14.08
mat[0[[3]
*(*(mat+0)+3)
17.3
mat[1[[0]
*(*(mat+1)+0)
20
mat[1[[2]
*(*(mat+1)+1)
2.95
mat[1[[3]
*(*(mat+1)+2)
0.082
mat[1[[4]
*(*(mat+1)+3)
6.023
Si en
x[10][20] quiero acceder al elemento de la fila 3 y la
columna 6, lo hago escribiendo x[2][5]. Con notacin de
punteros, es equivalente a
* ( * ( x + 2 ) +5)
ya que x + 2 es un puntero a la fila 3. Por tanto. El contenido de
dicho puntero, *(x+2), es la fila 3. Si me desplazo 5 posiciones
en esa fila llego a la posicin *(x+2)+5, cuyo contenido es
*(*(x+2)+5). Ver dibujo:
31
Si en
x[10][20] quiero acceder al elemento de la fila 3 y la
columna 6, lo hago escribiendo x[2][5]. Con notacin de
punteros, lo que hacemos es considerar que es un array formado
por 10 arrays unidimensionales (vectores) de 20 elementos cada
uno, de modo que accedo a x[2][5] mediante la expresin:
* ( * ( x + 2 ) +5)
Ver: ardepunt.cpp.
pmatcon.cpp
ya que x + 2 es un puntero a la fila 3. Por tanto. El contenido de
dicho puntero, *(x+2), es la fila 3. Si me desplazo 5 posiciones
en esa fila llego a la posicin *(x+2)+5, cuyo contenido es
*(*(x+2)+5). Las siguientes expresiones con punteros son vlidas:
**x
*(*x+1)
x[0][0] ;
x[0][1];
*(*(x+1))
x[1][0]
**(x+1)
x[1][0]
32
Si en
int array[filas][columnas];
quiero acceder al elemento array[y][z] para asignarle un valor, lo
que el compilador hace es:
*(*array +columnas x y + z)) = 129; //asignacin
Si fuera int array[2][5] y quisiera asignar 129 al elemento de la fila
1 y columna 2, pondra:
*(array + 5x1 + 1)) = 129;
es decir, desde el origen del array avanza 6 posiciones
array[1][1]
de memoria:
fila 0
fila 1
129
*(*(array+5)+1)
*(*array + 6)
33
PUNTEROS A ARRAYS
Un array multidimensional es, en realidad, una coleccin de
vectores. Segn esto, podemos definir un array bidimensional
como un puntero a un grupo contiguo de arrays unidimensionales.
Las declaraciones siguientes son equivalentes:
int dat[fil][col]
int (*dat)[col]
En general:
tipo_dato nombre[dim1][dim2]. . . . .[dimp]; equivale a:
tipo_dato (*nombre)[dim2][dim3]. . . . .[dimp];
Puntero a un grupo de arrays
Ver pmatcon.cpp
34
El array:
int valor[x][y][z];
Ver: ardepun.cpp
(*valor)[1][2]
(*(valor+1))[y][z]
(*(valor+1)[1][1]
35
Array de 200
punteros,
cada uno de
los cuales
apunta a un
array de 30
elementos
int *x[10];
float p[10][20][30];
int *p[10][20];
Ver
ejemp11.cpp
ejemp12.cpp
36
direccin de memoria
P E P E
*(nombre+2)
P E R E Z \0
contenido
37
nombre
P E P E
P E R E Z \0
*(nombre+2)
Ver: pcad.cpp
arraycad.cpp
printf(%c, *(nombre+i);
while(*(nombre+ i ++)); //postincremento
Condicin de
salida
38
cad[0]
...
cad
cad+1
...
\0
cad[4]
A
...
\0
...
39
...
reserva
...
...
...
...
41
42
43
Declaraciones complejas:
Para interpretar declaraciones complejas podemos seguir el orden:
1) Empezar con el identificador y ver si hacia la derecha hay
corchetes o parntesis.
2) Interpretar esos corchetes o parntesis y ver si hacia la
izquierda hay asteriscos.
3) Dentro de cada nivel de parntesis, de ms internos a ms
externos, aplicar puntos 1 y 2.
Veamos un ejemplo:
6 4 2 1
La interpretacin es:
1. La variable var es declarada como
2. un puntero a
3. una funcin que devuelve
4. un puntero a
5
Para declaraciones
de mayor
complejidad, ver el
archivo
declarpunt.doc
47
48
ABRIL-2014
Deseo que te haya sido til
49