Está en la página 1de 39

Fundamentos de Software de

Comunicaciones

Repaso C/C++
Arrays, Cadenas,
Estructuras y Punteros

Apuntes descargados de wuolah.com


Contenidos
Arrays

Cadenas

Bibliotecas de funciones

Estructuras

Punteros

Memoria dinmica

Argumentos a funciones

Constantes

Punteros y arrays

Punteros a funciones

Convivencia de funciones C++ y C

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Arrays
Declaracin
o tipo nombre[tamao];

Inicializacin
o tipo nombre[] = {const, const, .. const};
o NOTA: la asignacin de arrays completos es ilegal
char array1[50];
char array2[50];
array1 = array2; //ERROR (se ver la causa ms adelante)

Acceso a un elemento
o nombre[ndice]
Donde ndice est entre [0 , tamao 1]

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Ejemplo de arrays
#include <iostream>
int main(int argc, char **argv){
int arr[10];
int i; /* indice del array */
int in;

for (i=0;i<10;++i) arr[i] = i; /* inicializacion con valores*/

for (i=0;i<10;++i) cout << arr[i]; /* impresion del array */

std::cout << "\nIntroduce el numero a buscar: " << endl;


std::cin >> in;

i=0;
while ( (i < 10) && ( arr[i++] != in) );
if ( i == 10 )
std::cout << "El numero " << in << "no esta en el array" << endl;
else
std::cout << "El numero " << in << "esta en la posicion " << i-1 <<
endl;
return 0;
}
4
Arrays en C++ y en C
C++:
#include <tr1/array>
std::tr1::array<int, 50> mi_array;
mi_array[0] = 0;
mi_array.size();

C:
int mi_array[50] = {1,2,3}; //este tiene 50 elementos, pero 3 en uso
int mi_array2[] = {1,2,3}; //este tiene solo 3 elementos
typedef int TipoArray[5];
TipoArray mi_array3;
mi_array[0] = 0;
//NO es posible consultar el tamao de un array en C (lo cual es peligroso)

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Cadenas de caracteres

Declaracin como arrays


char nombre[tamao];

Acceso como array y con funciones especiales


Almacenamiento con un terminador '\0', que ocupa una posicin

u n a c o n s t a n t e \0

Inicializacin:
char cadena[] = {u, n, o, \0};
char cadena2[] = "uno"; //el compilador pone el '\0'

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Ejemplo de cadenas
#include <iostream>
#define MAXLINE 1000
int getline(char line[], int maxline); //definida por el programador!
void copy(char destino[], char orgien[]);//definida por el programador!

int main(int argc, char **argv){


int len; // longitud de la linea actual
int max=0; // maxima longitud actual
char line[MAXLINE]; // linea actual
char longest[MAXLINE]; // linea mas larga

while((len = getline(line, MAXLINE)) > 0){


std::cout << len << ": " << line << endl;
if(len > max){
max = len;
copy(longest, line);
}
}
if(max > 0)
std::cout << "El mas largo es " << max << "caracteres: ", longest <<
endl;
return 0;
}
7

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Ejemplo de cadenas (y II)

/* copy: copia una cadena de caracteres origen en otra


destino*/
void copy(char destino[], char origen[]){
int i;
equivalente a: copy(char *to, char *from){

i = 0;
while((destino[i] = origen[i]) != '\0'){
++i;
}
}

8
Cadenas en C++ y en C
C++: mtodo C++ funcin C
#include <string> string::length strlen
std::string s("hola");
string::assign strcpy
s.length();
string::copy strcpy
C: string::append strcat
#include <string.h> string::compare strcmp
char s[50] = "hola"; string::find strstr
char s2[] = "hola";
... ...
char s3[50] = {'h','o','l','a','\0'};
strlen(s);

9 Software de Comunicaciones guiado por modelos 9

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Conversin de objetos string a char*

10

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Bibliotecas (I)
C++: #include <cstring> //no confundir con la clase std::string
C: #include <string.h>
Esta cabecera declara un conjunto de funciones para manipular
cadenas de caracteres (y arrays)
Funciones:
Copia:
memcpy, memmove, strcpy y strncpy
Concatenacin:
strcat y strncat
Comparacin:
memcmp, strcmp y strncmp
Bsquedas:
memchr, strchr, strcspn, strpbrk, strrchr, strspn, strstr y strtok
Otras:
memset, strerror y strlen

11
Consulta rpida: http://www.cplusplus.com/reference/clibrary/cstring/

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Bibliotecas (II)

C++: #include <cstdlib>


C: #include <stdlib.h>
Esta cabecera declara un conjunto de
funciones de propsito general
Funciones:
o atof
o atoi
o atol
o strtod
o strtol
o strtoul

12
Consulta rpida: http://www.cplusplus.com/reference/clibrary/cstdlib/
Bibliotecas (III)
C++: #include <cctype>
C: #include <ctype.h>
Esta cabecera declara un conjunto de funciones para
clasificar y transformar caracteres individuales
Funciones:
o iscntrl
o isspace
o isupper
o islower
o isalpha
o isdigit
o isxdigit
o isalnum
o ispunct
o isgraph
o isprint
13
Consulta rpida: http://www.cplusplus.com/reference/clibrary/cctype/

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Definicin de estructuras
Una estructura es una coleccin de variables
(incluidas estructuras)
struct nombre {
tipo nombre_campo;
tipo nombre_campo;
.......
};

En C/C++, una estructura puede utilizarse como


una variable (asignacin, paso como parmetro,
valor de vuelta de una funcin)

Las estructuras no se pueden comparar


14

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Campos de bits en estructuras
Se usan para ahorrar espacio de almacenamiento,
pero depende del compilador cmo se almacena la
estructura en memoria (su tamao real)
struct Permisos{
unsigned int lectura : 1; //un bit
unsigned int escritura : 1; //un bit
unsigned int ejecucion : 1; //un bit
};

permisos.lectura = 0;
permisos.escritura = 1;
sizeof(Permisos) ? NO puede ser 3 bits!

15

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Uniones
Superposicin en memoria de elementos
heterogneos
Solo existe un espacio de memoria (el del campo
con mayor sizeof)
Sin embargo, el acceso a ese espacio de memoria
se hace indistintamente con cualquier campo,
como en una estructura
union Nombre { union Cantidad {
tipo1 elemento1; int ival;
tipo2 elemento2; float fval;
... } c;
} variables;
c.ival = 20;
16
Repaso de punteros

int x = 10;
int *p; p

p = &x; 10 x

p guarda la direccin de memoria de x


17

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Repaso de punteros (II)

int x = 10;
int *p; p

p = &x; 20 x

*p = 20;

*p es el contenido al que apunta p.


18

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Repaso de punteros (III)

Declara un puntero a un entero

int x = 10;
int *p;

p = &x; & es el operador direccin,


que obtiene la direccin de x

*p = 20;
Es el operador desreferencia,
que obtiene el valor apuntado por p

19

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Reserva de memoria dinmica: new
tipo *p = new tipo;

new reserva memoria para almecenar una


variable de un tipo concreto en el heap

new devuelve el puntero a esa variable u


objeto, o cero si no fue capaz de hacer la
reserva

Tambin en versin array:

tipo *p = new tipo[50];


// p apunta a la primera casilla
// se accede a los contenidos con p[x]
20
Liberacin de memoria dinmica con delete
// reserva
int *p = new int;
...
// libera memoria
delete p;

Por cada llamada a new, debe haber una (y slo una) a


delete.

delete libera el espacio que ocupaba el objeto/variable en


memoria

En versin array:

int *p = new int[5];

delete[] p;

21

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Memoria dinmica en C++ y C
C++
new, new []
delete, delete[]
o o bien:
#include <cstdlib>
int * p = (int *)malloc(50*sizeof(int))
free(p);
C:
#include <stdlib.h>
int * p = (int *)malloc(50*sizeof(int))
//alternativa: int * p = (int *)calloc(50,sizeof(int));
//si usas calloc el contenido de memoria se pone a cero!
free(p);

No mezclar nunca new-free y malloc-delete

22

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


El operador "->"

struct MisDatos{
int dato1;
int dato2;
};

MisDatos *p = new MisDatos;

// Acceso a campos:
(*p).dato1 = 5;

// Es equivalente a:
p->dato1 = 5;
23

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Heap (montn) vs. Stack (pila)

En el Heap / En la Pila /
Reserva dinmica Reserva automtica

void pinta() void pinta()


{ {
MisDatos *p = new MisDatos; MisDatos p;
p->dato1 = 5; p.dato1 = 5;
//... //...
} }

Qu sucede cuando p queda fuera de alcance?


24
Argumentos pasados por valor
void cuadrado(int i)
{
i = i*i;
}
int main()
{
int i = 5;
cuadrado(i);
cout << i << endl; //resultado: 5
}

25

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Qu es una referencia?
Un alias, otro nombre para una variable
int x = 5;
int &y = x; // y es una
// referencia a x
y = 10;

Qu pasa con x?
Qu pasa con y?

Las referencias SLO existen en C++, no en C

26

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Argumentos pasados por referencia
//Slo vlido en C++
void cuadrado(int & i)
{
i = i*i; /* el i de esta funcion es el alias
de la variable que le pasen como argumento son
la misma! */
}
int main()
{
int x = 5;
cuadrado(x);
cout << x << endl; //resultado: 25
return 0;
}

27

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Referencias y Punteros

Referencia (C++) Puntero (C/C++)

int &; int *;

int a = 10; int a = 10;


int b = 20; int b = 20;
int &c = a; int *c = &a;
c = b; c = &b;

28
Argumentos pasados por direccin
void cuadrado(int * i)
{
*i = (*i)*(*i); /* el i de esta funcion
es un puntero a la variable que le pasen
como argumento */
}
int main()
{
int x = 5;
cuadrado(&x);
cout << x << endl; //resultado: 25
return 0;
}
29

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Argumentos pasados por direccin (II)
void nuevoValor(int * i)
{
i = new int; /*como el puntero se pasa
por valor, su nuevo valor no se propaga
fuera de la funcion*/
*i = 7;
}
int main()
{
int x = 5;
cuadrado(&x);
cout << x << endl; //resultado: 5
return 0;
30 }

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Argumentos pasados por direccin (III)
void nuevoValor(int ** i)
{
*i = new int; /*ahora si puedo reasignar
el puntero*/
**i = 7; /*asignacion vlida!*/
}
int main()
{
int *x;
cuadrado(&x);
cout << *x << endl; //resultado: 7
return 0;
}
31

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Argumentos pasados por direccin (IV)
//Esto es lo que se hace en C++
void nuevoValor(int *& i)
{
i = new int; /*ahora si puedo reasignar
el puntero*/
*i = 7; /*asignacion vlida!*/
}
int main()
{
int *x;
cuadrado(&x);
cout << *x << endl; //resultado: 7
return 0;
32 }
Ms sobre punteros como argumentos
No es eficiente pasar zonas de memoria grandes
(arrays) por valor a una funcin, puesto que se copian
en su contexto de ejecucin

El compilador pasa los arrays a una funcin siempre


como punteros
o void funcion(char array[])
//es equivalente a
o void funcion(char *array)

El programador debe hacer lo mismo si piensa mover


grandes cantidades de datos entre funciones

Y en C no existen las referencias: f(tipo &var)


o solo se vern prototipos de la forma: f(tipo *var)
o pero ya se ha visto que no es exactamente equivalente!

33

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


El modificador const

void imprimeCuadrado(const int& i)


{
i = i*i; No compila!
cout << i << endl;
}
int main()
{
int i = 5;
imprimeCuadrado(i);
}

34

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Declaraciones con const

const MisDatos m; //constante

const MisDatos * cpm; //puntero constante

MisDatos* const pcm;//puntero a constante

const MisDatos* const pccm; //puntero constante


a constante

35

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Punteros y arrays
El identificador de un array o cadena es un puntero constante a su primer
elemento
int array1[20], array2[20];
int * p;
p = array1; //valido!
array2 = p; //no valido, array2 (y array1) son punteros constantes

Se puede trabajar indistintamente con [] o con aritmtica de punteros:

#include <iostream>
int main () {
int numbers[5];
int * p;
p = numbers; *p = 10;
p++; *p = 20;
p = &numbers[2]; *p = 30;
p = numbers + 3; *p = 40;
p = numbers; *(p+4) = 50;
for (int n=0; n<5; n++)
std::cout << numbers[n] << ", ";
return 0;
}
36
Punteros a funciones
Una funcin C no es una variable, pero
Se puede apuntar a la memoria donde comienza un
segmento de cdigo (funcin)
Se puede usar el puntero como el de una variable

Se define el tipo de las funciones


que tienen el mismo tipo de retorno
y los mismos argumentos

Las funciones definidas que lo cumplan son valores


del tipo

37

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Punteros a funciones
int (*pf) () /* puntero a funcin que devuelve un entero */

void (*pv) () /* puntero a funcin que devuelve void */

char (*(*x())[])() /* puntero a funcin que devuelve un


array de punteros a funciones que devuelven char */

char (*(*x[3])())[5] /* array de 3 punteros a funciones que


devuelven punteros a arrays de 5 char */

Ejemplo:

int f(){
return 0;
}

pf = &f; //asignacion del puntero a funcion


pf(); //ejecucin de la funcion!

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla


Convivencia de funciones C++ y C
Si queremos utilizar funciones definidas en C (y en ficheros .c) en
otros mdulos C++ (ficheros .cpp), los prototipos de las funciones
tienen que incluir esta notacin:

En el .h correspondiente (que se incluye luego en un .cpp):

#ifdef __cplusplus
extern "C" {
#endif

//aqui van todos los prototipos de las funciones


void f(int i, char c, float x);
//...

#ifdef __cplusplus
}
#endif

Ms en:
http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html
39

Mster Dir. y Gestin de RR.HH - Escuela de Negocios Cmara de Sevilla

También podría gustarte