Lenguaje C [Apuntadores y arreglos]

Documentos relacionados
Curso de Programación en C. Licenciatura, FCQeI. APUNTADORES.

Tema 13: Apuntadores en C

Laboratorio de Arquitectura de Redes. Punteros en lenguaje C

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

Apuntadores (Punteros)

Programación estructurada (Introducción a lenguaje C)

TEMA 8: Gestión dinámica de memoria

Concepto y manipulación de punteros

Analista Universitario en Sistemas. Taller de Programación II. Instituto Politécnico Superior PUNTEROS

Estructura de Datos [Tipos de datos concretos y tipos de datos abstractos]

Programación. Test Autoevaluación Tema 3

Memoria Dinámica. Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez

Funciones Tipos de funciones y Recursividad

Apuntadores en C y C++

Un puntero no es más que una variable estática cuyo contenido es una dirección de memoria.

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

Elementos de un programa en C

Algoritmos y Programación I

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

Tipos de Datos Estructurados

Al concluir está práctica el estudiante será capaz de elaborar programas utilizando apuntadores y arreglos.

FUNDAMENTOS DE PROGRAMACIÓN

1. Sobrecarga de operadores. 2. Métodos operadores unarios Operador de incremento (prefijo)

ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Tema ADQUISICIÓN Y TRATAMIENTO DE DATOS. Departamento de Ciencias de la Computación e IA. Subprogramas en C

El lenguaje C. #define MAX LINEA 1000 /* maximo tamanio de linea de entrada */

funciones printf scanf

Tema 8 Vectores y Matrices

TIPOS DE DATOS BASICOS EN LENGUAJE C

Definición y Conversión de datos. Agustín J. González ELO-329

Lección 2 Introducción al lenguaje C

Tema 14: Arreglos estáticos en C

OPERADORES Y EXPRESIONES

Definición. Una estructura es un grupo de datos que pueden ser de distintos tipos de datos, pero a los que se les ha asignado un único nombre.

Caracteres y Cadenas Conversión de Datos Funciones y procedimientos Archivos cabecera. Fundamentos de programación

Punteros, Arreglos y Cadenas en C

TEMA 8: ESTRUCTURAS DE DATOS COMPLEJAS 1 VECTORES ESTÁTICOS 2 2 CADENAS O VECTORES DE CARACTERES 6 3 PASO DE CADENAS Y ARRAYS A FUNCIONES 8

Introducción al lenguaje C

Este material es de uso exclusivo para estudio, los textos fueron tomados textualmente de varios libros por lo que está prohibida su impresión y

Se guardan en archivos con extencion c y los cabezales con extension h

4. Operadores Operador asignación

El lenguaje de Programación C. Fernando J. Pereda

Curso de Programación Avanzada en C

Resumen de Sintaxis en C

Uso avanzado de punteros

Introducción a variables de tipo Puntero (Apuntadores) Contenidos. 1. Introducción a las variables puntero 2. Repaso:

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Expresiones Aritméticas. Programación digital I Escuela de Sistemas Facultad de Ingeniería Gilberto Diaz

Contenido. Capítulo 1. Introducción a lenguaje C 1

Java para programadores

Escuela Politécnica Superior de Elche

LENGUAJE. Tema 2 Elementos de un programa

Programación En Lenguaje C

Un módulo de programa tiene dos partes bien diferenciadas: la definición del módulo y la invocación o llamada al módulo.

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

PRÁCTICA DE LABORATORIO 4 Programación Orientada a Objetos

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Punteros. Definición Un puntero es un dato que contiene una dirección de memoria.

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Programación Orientada a Objetos con Java. Elementos Básicos del Lenguaje Java. Creación de un objeto. Creación de un objeto. Creación de un objeto

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

Lenguaje de programación C. Introducción

El lenguaje C. 1. Identificadores, constantes y variables

Universidad Don Bosco (UDB) Facultad de Ingeniería / Escuela de Computación

Unidad V Análisis Semántico. M.C. Juan Carlos Olivares Rojas

Laboratorio de Arquitectura de Redes. Entrada y salida estándar

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Informática Ingeniería en Electrónica y Automática Industrial

Instituto Tecnológico de Celaya

Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS

Un identificador le da nombre único a un elemento en un programa (Variables, procedimientos, etc.). No puede contener operadores como + - * /

PROGRAMA DE ASIGNATURA DE PROGRAMACIÓN I

Ejercicio 1. Ejercicio 2

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Cadena de caracteres. 1. Fundamentos de cadenas y caracteres

LEX. Las definiciones y subrutinas son opcionales. El segundo %% es opcional pero el primer %% indica el comienzo de las reglas.

Tema 8 Punteros. Fundamentos de Informática

Fundamentos de programación

LENGUAJE. Tema 1 - Introducción

Guía - Taller # 2 (JAVA)

Tema 7: Polimorfismo. Índice

PROGRAMACION ORIENTADA A OBJETOS EN C++

EQUIVALENCIAS EN C DE CONSTRUCCIONES SECUENICIALES EN PSEUDOCÓDIGO

Preliminares. Tipos de variables y Expresiones

Programación Estructurada

Instituto Politécnico Nacional

Introducción a C++ y Code::Blocks

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

El lenguaje C: Elementos básicos del lenguaje

PROGRAMACION / Clave: 11214

Tema 16: Tipos de datos estructurados en lenguaje C

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Test : Conteste exclusivamente en una HOJA DE LECTURA ÓPTICA, no olvidando marcar que su tipo de examen es A.

Examen Principios de Programación Febrero 2012

Tema: Punteros a Objetos. Puntero this.

1. Cuántas sentencias hay en la secuencia principal del siguiente programa?

CONCEPTOS BASICOS DEL LENGUAJE JAVA

Contenidos. Funciones (suplemento) Funciones. Justificación del uso de Funciones

EXAMEN PARCIAL TRABAJO INTEGRADOR (TI) EVALUACIÓN CONTINUA PESO PORCENTUAL PESO PORCENTUAL 1 30% 06-MAY-14 30% 03-MAY-14 20% 20%

Transcripción:

Lenguaje C [Apuntadores y arreglos] M. en C. Sergio Luis Pérez Pérez UAM CUAJIMALPA, MÉXICO, D. F. Trimestre 14-O Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 1 / 20

Apuntadores y direcciones Apuntadores y direcciones 1 Apuntadores y direcciones 2 Apuntadores y arreglos 3 Apuntadores a caracteres 4 Arreglos de apuntadores y multidimensionales Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 2 / 20

Apuntadores y direcciones Apuntadores y direcciones I Un apuntador es una variable que contiene la dirección de una variable. El operador unario es el operador de indirección o desreferencia, de manera que cuando se aplica un apuntador se tiene acceso al objeto que señala. El operador & sólo se puede aplicar a objetos que están en memoria, es decir variables y elementos. El operador & no puede aplicarse a expresiones, constantes o variables tipo registro. Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 3 / 20

Apuntadores y direcciones Apuntadores y direcciones II La declaración de un apuntador como: int ip; funciona como mnemónico y dice que la expresión *ip es un int. Ejemplo 1 int x = 1, y = 2, z[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int *ip, *iq, i; ip = &x;/*ip apunta a x*/ y = *ip;/*y ahora vale 1*/ *ip = 0;/*x ahora vale 0*/ ip = &z[0];/*ip apunta a 0 de z[0]*/ printf( %d %d %d %d %d\n, x, y, *ip, z[0], ip); Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 4 / 20

Apuntadores y direcciones Apuntadores y direcciones III Ejemplo 1 continuación *ip = *ip + 10; iq = ip;/*iq apunta a lo mismo que ip*/ for(i = 0; i < 10; i++, ip++) printf( %d\n, *ip); ip = iq;/*ip apunta a lo que apuntaba originalmente*/ Debido a que C pasa los argumentos por valor si se desea hacer una especie de paso por referencia es necesario pasar las variables como &variable pues debido a que & produce la dirección de una variable entonces &variable es un apuntador. intercambia(&a, &b) Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 5 / 20

Apuntadores y direcciones Apuntadores y direcciones IV Intercambia void intercambia(int *a, int *b){ int temporal = *a; *a = *b; *b = temporal; return; } Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 6 / 20

Apuntadores y arreglos Apuntadores y arreglos 1 Apuntadores y direcciones 2 Apuntadores y arreglos 3 Apuntadores a caracteres 4 Arreglos de apuntadores y multidimensionales Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 7 / 20

Apuntadores y arreglos Apuntadores y arreglos I La relación entre apuntadores y arreglos en el caso de lenguaje de C es muy estrecha. Cualquier operación que pueda lograrse por indexación de un arreglo también puede lograrse con apuntadores. La versión con apuntadores tenderá a ser más rápida pero difícil de entender. Ejemplo 2 int v[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, *pv; pv = &v[0]; for(i = 0; i < 10; i++) printf( %d %d\n, *(pv+i), v[i]); Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 8 / 20

Apuntadores y arreglos Apuntadores y arreglos II Lo que ocurre es que en C al evaluarse v[i] se convierte inmediatamente a *(v+i). Sin embargo existe una diferencia entre el nombre de un arreglo y el de un apuntador. Las instrucciones pv = v y pv++ es válida para el ejemplo mencionado. Las instrucciones v = pv y v++ son ilegales. Los parámetros formales: char s[], char *s; en la definición de una función son equivalentes pero el último indica más explícitamente que el parámetro es un apuntador. Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 9 / 20

Apuntadores y arreglos Apuntadores y arreglos III También es posible pasar a una función una posición de inicio diferente para el arreglo como: f (&a[2]) o bien f (a + 2) La declaración de parámetros puede ser: f (int a[]){... } o bien f (int a){... } A la función f no le interesa que a sea en realidad un arreglo más grande. Esto permite que se puedan hacer referencias hacia atrás sobre un arreglo siempre que las localidades sean válidas. a[ 1], a[ 2] Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 10 / 20

Apuntadores y arreglos Apuntadores y arreglos IV Un apuntador p es incomparable a un int salvo en el caso del cero que comúnmente se suele utilizar como la macro NULL definida en <stdio.h>. La instrucción p + + permite apuntar al elemento de adelante mientras que p+ = i al que se encuentra i posiciones adelante si i > 0. El número de posiciones que se avanza es siempre escalado al tamaño de a lo que apunta p, por ejemplo 1 para char o 4 si se trata de int de 4. Dos apuntadores pueden ser restados, por ejemplo con la finalidad de conocer el tamaño de un arreglo. Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 11 / 20

Apuntadores y arreglos Apuntadores y arreglos V Ejemplo: regresar la longitud de una cadena int strlen(char *s){ char *p = s; while(*p!= \0 ) p++; return p - s; } No es legal sumar dos apuntadores, multiplicarlos o dividirlos, enmascararlos o agregarles un float o un double. Tampoco se pueden asignar dos apuntadores de diferente tipo a menos que haya una conversión forzosa de tipo. Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 12 / 20

Apuntadores a caracteres Apuntadores a caracteres 1 Apuntadores y direcciones 2 Apuntadores y arreglos 3 Apuntadores a caracteres 4 Arreglos de apuntadores y multidimensionales Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 13 / 20

Apuntadores a caracteres Apuntadores a caracteres I Una constante de cadena es un arreglo de caracteres. Soy una cadena Internamente dicha cadena termina con \0. Las cadenas constantes pueden ser tratadas como const char, sin embargo, si tratan de ser manipuladas entonces el comportamiento no está definido. char amensaje[] = hola mundo ; char *pmensaje = hola mundo ;/*instrucción obsoleta*/ const char *cpmensaje = hola mundo ; amensaje es un arreglo y dado que tiene memoria asignada puede ser modificado. Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 14 / 20

Apuntadores a caracteres Apuntadores a caracteres II pmensaje es una instrucción obsoleta y tratar de modificar la cadena da un comportamiento indefinido. Sin embargo, se le puede apuntar a otro lado. cpmensaje es una constante de cadena y no puede ser modificada. Si se desea copiar una cadena t en otra s debe hacerse caracter por caracter. void copia(char *s, char *t){ int i = 0; while((s[i] = t[i])! = \0 ) i++; return; } Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 15 / 20

Apuntadores a caracteres Apuntadores a caracteres III La misma función se puede hacer simplemente manipulando los apuntadores y a lo que apuntan. void copia(char *s, char *t){ while((*s = *t)! = \0 ) s++, t++; return; } Ejercicio: Intente reducir el tamaño de copia para lograr el mismo propósito. Los operadores ++ y pueden ser utilizados en combinación con el operador unario. *p++;/*devuelve a lo que apunta p y luego incrementa p*/ * p;/*decrementa p y luego devuelve a lo que apunta*/ Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 16 / 20

Arreglos de apuntadores y multidimensionales Arreglos de apuntadores y multidimensionales 1 Apuntadores y direcciones 2 Apuntadores y arreglos 3 Apuntadores a caracteres 4 Arreglos de apuntadores y multidimensionales Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 17 / 20

Arreglos de apuntadores y multidimensionales Arreglos de apuntadores y multidimensionales I Si se desea tener un conjunto de palabras o líneas de texto almacenadas en C entonces se puede utilizar un apuntador a apuntadores. char **lineas;/*es un apuntador a apuntadores*/ char *lineas[1000];/*son 1000 apuntadores a caracteres*/ En el caso de **lineas primero tendría que apartarse memoria para el número de apuntadores deseados y posteriormente para cada apuntador. La función void *malloc(size t size) permite apartar memoria para un apuntador por lo que la siguiente instrucción da el espacio para los 1000 apuntadores y luego para cada apuntador. Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 18 / 20

Arreglos de apuntadores y multidimensionales Arreglos de apuntadores y multidimensionales II lineas = (char**)malloc(1000*sizeof(char*)); for(i = 0; i < 1000; i++) lineas[i] = (char*)malloc(maxtam*sizeof(char)); Como lineas es el nombre de un arreglo entonces puede tratarse como apuntador. Lo mismo en el caso donde es un apuntador a apuntador. int escribir lineas(char *lineas[], int nlineas){ while(nlineas > 0) printf( %s, *lineas++); return; } Una forma de inicializar los arreglos de apuntadores a cadenas es la siguiente: Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 19 / 20

Arreglos de apuntadores y multidimensionales Arreglos de apuntadores y multidimensionales III const char *mes(int n){ static const char *nombre[] = { mes invalido, enero,... }; return n < 1 n > 12? nombre[0] : nombre[n]; } Los apuntadores a otros tipos de datos deben inicializarse con malloc, por ejemplo: int *v = {0, 1, 2, 3}; es una instrucción invalida. Tendría que ser: v = (int*)malloc(4*sizeof(int)); v[0] = 1, v[1] = 2, v[2] = 3, v[3] = 4; Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Lenguaje C 20 / 20