Programación I
Técnico Universitario en Web
Dpto. de Informática
FCFMyN - UNSL
-5-
Lenguaje C – Pasaje de Parámetros (PP): Arreglos
 Basta
con indicar su nombre sin los
corchetes.
int ar[12];
….
modificarArreglo(ar, 12);
/*  modificarArreglo(&ar[0], 12); */
2
Lenguaje C – PP: Arreglos
 Declaración
void modificarArreglo(int b[ ], int max) { … }
Se colocara el
tipo y nombre del
arreglo; su
tamaño no es
necesario.
3
Lenguaje C – PP: Arreglos
#include <stdio.h>
#define MAX 5
void muestraArreglo(int [], int);
void modificaArreglo(int [], int);
void modificaElemento(int);
int main()
{
int a[MAX] = {2, 4, 6, 8, 10};
int i;
printf("Los valores del arreglo antes de
modificarlos son:\n");
muestraArreglo(a, MAX);
modificaArreglo(a, MAX);
printf(“Valores del arreglo despues de
llamar” “ a modificaArreglo
son:\n”);
muestraArreglo(a, MAX);
for (i = 0; i < MAX; i++)
modificaElemento(a[i]);
printf(“Valores del arreglo despues de
llamar” “ a modificaElemento
son:\n”);
muestraArreglo(a, MAX);
return 0;
void muestraArreglo(int b[], int max)
{
int i;
for (i = 0; i < max; i++)
printf("%d ", b[i]);
printf("\n");
}
void modificaArreglo(int b[], int max)
{
int i;
for (i = 0; i < max; i++)
b[i] = b[i] + 1;
}
}
4
Lenguaje C – PP: Arreglos
void modificaElemento(int elem, int pos) {
elem = 0;
printf(“El valor del elemento %d dentro de”
“ modificaElemento es: %d\n”, pos, elem);
}
5
Lenguaje C – PP: Arreglos
void modificaElemento(int *elem, int pos) {
*elem = 0;
printf(“El valor del elemento %d dentro de”
“ modificaElemento es: %d\n”, pos, *elem);
}

modificaElemento(&a[i], i);
6
Lenguaje C – Punteros y Arreglos
 Todas
las operaciones que se realizan
con arreglos pueden también ser
realizadas usando punteros.
int a[5] = {1, 4, -5, 0, 8};
int *p;
…
p = a; /* es equivalente a p = &a[0]; */
7
Lenguaje C – Punteros y Arreglos
int a[5] = {1, 4, -5, 0, 8};
int *p;
…
p = a; /* es equivalente a p = &a[0]; */
printf(“%d”, a[0]);

printf(“%d”, *a);

printf(“%d”, *p);
8
Lenguaje C – Aritmética de Punteros
 Se
pueden realizar algunas operaciones
aritméticas con punteros.

Un puntero puede ser incrementado (++) o
decrementado (--), se le puede sumar o restar
un valor entero o incluso pueden sumarse y
restarse punteros entre si.

p = p + 2; /* Dejara al puntero p apuntando al
elemento a[2] */
9
Lenguaje C – Aritmética de Punteros
 Si
p apunta a la componente j de un
arreglo y se le suma i quedara apuntando i
posiciones mas adelante, es decir, a la
posición j+i
10
Lenguaje C – Aritmética de Punteros

Los punteros pueden ser sustraídos y sumados
entre si. Supongamos las siguientes
declaraciones y asignaciones
int a[5] = {1, 4, -5, 0, 8};
int *p, *q, i;
p = a;
q = &a[3];
i = q – p;

Los punteros pueden también ser comparados
entre si, siempre que sean de un mismo tipo
puntero:
p == q; p != q; p <= q; p < q; p >= q; p > q
11
Lenguaje C – Aritmética de Punteros
void modificarArreglo(int b[], int max)
{
int i;
for (i = 0; i < max; i++)
b[i] = b[i] + 1;
}
void modificarArreglo(int b[], int size)
{
int i;
for (i = 0; i < max; i++)
*(b + i) = *(b + i) + 1;
}
------------------------------------------------void modificarArreglo(int *b, int size)
{
int i;
for (i = 0; i < max; i++)
b[i] = b[i] + 1;
}
-----------------------------------------------void modificarArreglo(int *b, int size)
{
int i;
for (i = 0; i < max; i++)
*(b + i) =
*(b + i) + 1;
}
12
Lenguaje C – STRINGS, ARREGLOS DE CARACTERES
Y PUNTEROS A char
char s1[] = “hola”;
char *s2 = “hola”;
En ambas se almacena el string “hola” en un arreglo de
5 posiciones;
 En ambos casos s1 y s2 apuntaran a la dirección base
del correspondiente arreglo.
Perooooo….
 La única diferencia esta en que s1 es un valor constante
ya que representa siempre la dirección del elemento 0
de s1 (recordemos que s1 es lo mismo que &s1[0]) y, en
consecuencia, no puede cambiar su valor; es decir, no
podemos hacer, por ejemplo, s1++;
 Con s2 si se puede hacer!!!!

13
Lenguaje C – STRINGS, ARREGLOS DE
CARACTERES Y PUNTEROS A char
 NO
se puede asignar a un arreglo de
caracteres una constante string, salvo en
la declaración del arreglo.
char s1[5];
s1 = “hola”; /* Incorrecto */
14
Lenguaje C – Punteros a Structs
struct triangulo {
float base;
float altura;
} triang = {5.0, 10.0};
…
struct triangulo *pTriang;
…
pTriang = &triang
15
Lenguaje C – Punteros a Structs
 Acceso
a campos por medio de punteros
(*pTriang).base = 6.0;

pTriang->base = 6.0;
16
Lenguaje C – PP: Registros
 Las
variables de tipo struct son pasadas
por valor.
 El pasaje por dirección se realiza
anteponiendo el operador de dirección &
al parámetro actual,
 El parámetro formal se lo especifica como
tipo puntero a struct y usando el operador
* de referenciación dentro del cuerpo de la
función.
17
Lenguaje C – PP: Registros
#include <stdio.h>
struct fecha{
int anio; int mes; int dia; };
void muestraFecha(struct fecha);
struct fechamodificaFecha(struct fecha);
main(){
struct fecha fechaNacimiento = { 1988, 10, 5};
muestraFecha(fechaNacimiento);
fechaNacimiento = ModificaFecha(fechaNacimiento);
muestraFecha(fechaNacimiento);
return 0;
}
void muestraFecha(struct fecha f) {
printf("%d/%d/%d\n", f.dia, f.mes, f.anio); }
18
Lenguaje C – PP: Registros
struct fecha modificaFecha(struct fecha f)
{
f.dia = 29;
f.mes = 6;
f.anio = 2000;
return f;
}
Salida:
5/10/1988
29/6/2000
19
Lenguaje C – PP: Registros
#include <stdio.h>
struct fecha{
int anio; int mes; int dia; };
void muestraFecha(struct fecha);
void modificaFecha(struct fecha *);
main(){
struct fecha fechaNacimiento = { 1988, 10, 5};
muestraFecha(fechaNacimiento);
ModificaFecha(fechaNacimiento);
muestraFecha(fechaNacimiento);
return 0;
}
void muestraFecha(struct fecha f) {
printf("%d/%d/%d\n", f.dia, f.mes, f.anio); }
20
Lenguaje C – PP: Registros
void modificaFecha(struct fecha *f)
{
(*f).dia = 29;
(*f).mes = 6;
(*f).anio = 2000;
}
Salida:
5/10/1988
 29/6/2000

21
Descargar

Teoría 5