Sei sulla pagina 1di 10

Prcticas con punteros, vectores y cadenas.

Por Salvador Fernndez

1. Declara una cadena de caracteres de nombre palindromo y asgnale la constante literal


AEREA en la misma lnea de declaracin. Hazlo de dos maneras diferentes.
char palndromo*+=AEREA;
char *palndromo=AEREA;
2. Suponiendo que tienes dos cadenas de caracteres, cad1 y cad2 tales que
strlen(cad1)==10 y strlen(cad2)==5, indica cmo se declara una tercera cadena cad3 y
se le asigna memoria dinmica (en el heap o montn) , teniendo en cuenta que cad3
va a contener la concatenacin de cad1 y cad2 sin que sobre ninguna posicin de
memoria.
NOTA: strlen(x) devuelve el nmero de caracteres de la cadena sin contar el carcter
de fin de cadena (\0);
char *cad1=abcdefghij;
char *cad2=opqrs;
// En total necesito reservar espacio para 16 caracteres (10 de cad1, 5 cad 2 y el
// carcter de fin de cadena \0
char *cad3=new char[strlen(cad1)+strlen(cad2)+1];
strcpy(cad3,);
strcat(cad3,cad1);
strcat(cad3,cad2);
delete [] cad3;
3. Si tienes declarada e inicializada una cadena de caracteres cad, indica dos maneras de
leer o acceder al carcter de la primera posicin.
*cad
cad[0]
4. Si en un programa que funciona adecuadamente aparece la sentencia delete s;
podemos adivinar que s es un puntero a
a. Un char, un int, o cualquier otra variable de tipo simple
b. Una cadena de elementos char, int, o de cualquier otro tipo simple
c. Es imposible que s sea un puntero.
5. Cmo puedes averiguar lo que ocupa un puntero a un char en tu computadora y
usando tu compilador de C++?
sizeof (char *)

Prcticas con punteros, vectores y cadenas. Por Salvador Fernndez

char *
Dir 0xff04

H
0
L
A
\0

char *
Dir 0xff08

C
U
R
S
O
\0

(int)&v[1] - (int)&v[0]= 0xff08 - 0xff04 = 4 bytes

char *v[2];
cout<<Tamao del puntero: <<(int)&v[1]-(int)&v[0]<< bytes<<endl;
6. Si ptrLetra es un puntero a un char, qu hace la instruccin *ptrLetra++=3;? y la
instruccin (*ptrLetra)++=3;? son iguales?

*ptrLetra=3;
*ptrLetra++=3
ptrLetra++;
Esta instruccin le asigna el cdigo ASCII 3 al carcter al que apunta el puntero ptrLetra
y a continuacin avanzan el puntero una posicin a la derecha.
(*ptrLetra)++=3 no compila, es semnticamente incorrecta. En C++ no es posible una
instruccin del tipo x++=3, siendo x una variable.
CONCLUSIN: evitar en la medida de lo posible hacer combinaciones de operadores
cuyo orden de evaluacin sea imprevisible.

7. Si quiero incrementar en una unidad el contenido de la variable a la que apunta un


puntero p, indica cules de las siguientes instrucciones seran vlidas:
*p = *p + 1;
*p += 1;
++*p;
*p++; // S compila pero es semnticamente incorrecta(no incrementa el valor
de la variable a la que apunta).

Prcticas con punteros, vectores y cadenas. Por Salvador Fernndez

8. Utilizando la notacin de vectores puedes acceder a la quinta posicin (posicin 4, ya


que los ndices empiezan en 0) de un vector v mediante la expresin v[4]. Cmo
haras referencia a dicha posicin usando notacin y aritmtica de punteros?
*(v+4)

// == v[4]

9. Dadas las siguiente declaraciones:


char *p;
char c;
Indica de dos maneras diferentes cmo expresar en C++ cada una de las siguientes
comprobaciones, donde carcter nulo se refiere a la marca de fin de cadena:
Si c es el carcter nulo
if (!c)
if (c==\0)
Si p apunta a un carcter nulo
if (!*p)
if (*p==\0) // no es lo mismo que if (*p==0)
Si p es un puntero nulo
if (p==NULL)
if (!p)

Prcticas con punteros, vectores y cadenas. Por Salvador Fernndez

10.

Indica los valores de las siguientes expresiones atendiendo a la disposicin del vector
de enteros lista que se representa en la figura:
lista[2] == 64
*(lista+3) == 33
&lista[1] == 1502
Lista == 1500
lista+2 == 1504
lista+1<&lista[1] == 1502<1502 == false
11. Crea una funcin para intercambiar dos nmeros enteros usando punteros equivalente
al paso mediante referencias de C++ que se indica. Para ello debes sustituir los
parmetros de entrada por punteros a enteros y cambiar el cdigo para adaptarlo a la
lgica de los mismos. Asimismo, indica cmo sera la llamada a la funcin para dos
variables enteras x e y.
int x=3, y=4;
intercambiar(x,y);
void intercambiar(int &a, int &b)
{
int temp=a;
a=b;
b=temp;
}

Prcticas con punteros, vectores y cadenas. Por Salvador Fernndez

intercambiar(&x, &y)
void intercambiar(int *ptr_a, int *ptr_b)
{
int temp=*ptr_a;
*ptr_a=*ptr_b;
*ptr_b=temp;
}
12. Puedes averiguar qu hace el siguiente cdigo? Qu contendrn letra1 y letra2 tras
la ejecucin del cdigo?
char letra1 = 'A';
char letra2 = 'B';
char* puntero = &letra1; /* puntero se declara como un puntero de tipo char, por lo
tanto, almacenar la direccin de una variable de ese tipo. De hecho, en la propia
declaracin se le asigna la direccin de memoria de la variable tipo char letra1. En
otras palabras puntero apunta a letra1 */
letra1 = 'C';
letra2 = *puntero; /* como puntero apuntaba a letra1 y en la instruccin anterior
hemos cambiado el valor de letra1 por C, entonces al dereferencia el puntero
mediante el operador * estamos asignndole ese valor C a letra 2 */
Al final del programa letra1==C y letra2==C

13. Teniendo el cdigo.


char letra = 'A';
char* puntero = &letra;

Indicar cules de las siguientes asignaciones son incorrectas y podran producir


errores:
letra = *puntero;
letra = &letra;
letra = &puntero;
puntero = *puntero;
puntero = *(&puntero);
puntero = *letra;
*puntero = letra;
&puntero = letra;

14. Contenidos de letra1 y letra2 al final del cdigo? A quin apuntan los punteros al
final?

Prcticas con punteros, vectores y cadenas. Por Salvador Fernndez

char letra1 = 'A';


char letra2 = 'B';
char* puntero1 = &letra1; //el puntero1 apunta a letra1
char* puntero2 = &letra2; //el puntero2 apunta a letra2
puntero1 = puntero2; /* puntero1 apunta ahora a la misma
variable a la que apunta puntero2, es decir, apunta a letra2 */
letra1 = 'C';
letra2 = 'D';
letra1 = *puntero1; /* puntero1 apunta a letra2; letra2 lo
hemos cambiado en la instruccin anterior al valor D; por lo
tanto le estoy asignado dicho valor a letra1. */

Al final, el valor de letra1==D y tambin el valor de letra2==D


15. Indica los valores que tendrn al final de la ejecucin del siguiente cdigo las variables
letra1, letra2 y letra3 en cada caso.
a.
char* cadena = "Hola";
char letra0 = *cadena; // Asignando H a letra0
char letra1 = *(cadena+1); // Asignando o a letra1
char letra2 = *(cadena+2); // Asignando l a letra2
char letra3 = *(cadena+3); // Asignando a a letra3
El nombre del vector, cadena, es un puntero al
primer elemento, por lo tanto almacenda la direccin de
memoria que ocupa dicho elemento. Sumando a la direccin del
primer carcter la posicin a la que quiero acceder me
desplazo a dicha posicin. Slo queda derefenciar la nueva
direccin mediante el operador de indireccin *
b.
char* cadena = "Hola";
char letra0 = *cadena; // Asignando H a
char letra1 = *cadena+1; // Asignando I
char letra2 = *cadena+2; // Asignando J
char letra3 = *cadena+3; // Asignando K

letra0
(H+1) a letra1
(H+2) a letra2
(H+3) a letra3

Al omitir los parntesis el operador de indireccin afecta


todo el rato al nombre del vector, por lo tanto, recupera
el carcter almacenado en la primera posicin. Al sumar un
valor positivo a dicho carcter estamos modificando su
cdigo ASCII, de tal modo que vamos asignando letras
sucesivas a la primera letra del vector.

Prcticas con punteros, vectores y cadenas. Por Salvador Fernndez

16. Reescribe el siguiente programa para calcular la media aritmtica de un vector de N


valores reales mediante notacin y aritmtica de punteros:
float media (float datos[], int N)
{
int i;
float suma = 0;
for (i=0; i<N; i++)
suma = suma + datos[i];
return suma/N;
}

float media (float datos[], int N)


{
int *ptri;
float suma=0;
for (ptri=datos; ptri<datos+N; ptri++)
suma = suma + *ptri;
return suma/N;
}

17. Representa mediante instrucciones lo que se representa en las figuras del estado de
memoria teniendo en cuenta las siguientes declaraciones de partida que se
corresponden con la primera instantnea. Todas los cambios de valor de las variables y
y z deben realizarse mediante punteros, siempre que se pueda. Si para un mismo
estado se te ocurren varias posibilidades indcalas como otras alternativas:

Prcticas con punteros, vectores y cadenas. Por Salvador Fernndez


int
int
int
int

y = 5;
z = 3;
*nptr;
*mptr;

nptr=&y;

z=*nptr;

*nptr=*nptr+2;

a) mptr=nptr;
b) mptr=&y;

mptr=&z;

a) z=*nptr;
b) *mptr=*nptr;
c) *mptr+=2;

*nptr++;
a) ++*nptr;
b) *nptr=*nptr+1;
c) *nptr+=1;

Prcticas con punteros, vectores y cadenas. Por Salvador Fernndez

18. Aqu tienes algunos cdigos que presentan errores. Trata de identificarlos y explica el
motivo del error:
int a = 10;
int *ptri = NULL;
double x = 5.0;
double *ptrf = NULL;
...
ptri = &a; //ptri apunta a la variable entera a
ptrf = &x; //ptrf apunta a la variable double x
ptrf = ptri; // la asignacin de punteros slo es posible
// entre punteros que apunten al mismo tipo base.

char *ptr;
*ptr = a; // ptr est apuntando a un sitio desconocido de
//la memoria porque no lo inicialic. Sera un puntero
//salvaje, sin control

int n;
int *ptr = &n;
ptr = 9; /* estoy asignndole la direccin 9 de memoria al
puntero, algo que no puedo hacer porque no s qu hay en
la direccin 9; ni siquiera s si el sistema operativo me
da acceso a esa direccin. En realidad, lo que se supone
que se quera hacer era *ptr=9, es decir, asignarle 9 a n
a travs del puntero ptr */

int *ptr = NULL;


*ptr = 9; /* el puntero est inicializado a NULL y no a
punta a ninguna variable concreta de la memoria. No se
puede dereferenciar un puntero nulo */

19. Qu valor tendr la variable a tras la ejecucin de este programa?


main ()
{
int
int
p =
q =
a =
// a =
}

a = 5; // a vale 5
*p; int **q;
&a; // p apunta a la variable a
&p; // q apunta a p
*p*2+**q;
5*2+5=15

El valor final de a es 15

20. Se pretende desarrollar tres fragmentos de cdigo que sumen los elementos de un
vector de enteros v de diferentes maneras. Completa dicho cdigo siguiendo las
instrucciones de los comentarios:
int i, suma;

Prcticas con punteros, vectores y cadenas. Por Salvador Fernndez


int *ptr, *ptrfin;
/* Alternativa 1 */
suma = 0;
for (i=0 ; i<N ; i++)
suma = suma + v[i]; //Utilizando notacin de vectores
/* Alternativa 2 */
suma = 0;
for (i=0 ; i<N ; i++)
suma = suma + *(v+i) ; //Utilizando notacin de punteros
//pero sin echar mano de ptr ni
//ptrFin
/* Alternativa 3 */
/* Inicializa los punteros si es necesario */
suma = 0;
ptr=v;
ptrfin = ptr + N; //Completa la expression para que
//ptrFin apunte al ltimo elemento
//del vector
for (ptr=v ; ptr<ptrfin ; ptr++) //Completa la condicin
suma = suma + *ptr;
//del bucle

Potrebbero piacerti anche