Ponteiros e Tabelas. K&R: Capítulo 5
|
|
|
- Ricardo Amarante Camilo
- 7 Há anos
- Visualizações:
Transcrição
1 Ponteiros e Tabelas K&R: Capítulo 5
2 Ponteiros e Tabelas Ponteiros e endereços Ponteiros e argumentos de funções Ponteiros e tabelas Alocação dinâmica de memória Aritmética de ponteiros Tabelas de ponteiros e ponteiros para ponteiros Tabelas multi-dimensionais Inicialização de tabelas de ponteiros Argumentos da linha de comandos 2
3 Ponteiros e Endereços Na memória do computador cada posição é referenciada por um endereço, atribuído de forma sequencial Posições adjacentes têm endereços consecutivos Um ponteiro é uma variável que contém um endereço de outra variável a 3
4 Ponteiros e Endereços: exemplo int x = 10; int *px = &x; x px Declaração de um ponteiro Inicializo px com o endereço de x (operador &) 4
5 O que é um ponteiro em C? 5
6 Um ponteiro em C é um endereço de memória 6
7 Declaração de ponteiros Na sua declaração temos de indicar ao compilador para que tipo de variável estamos a endereçar. Declaração de um ponteiro para tipo <tipo> <tipo> *<variável>; Exemplos char *cptr; /* ponteiro para caracter */ int *iptr; /* ponteiro para inteiro */ double *dptr; /* ponteiro para double */ 7
8 Declaração de ponteiros Na sua declaração temos de indicar ao compilador para que tipo de variável estamos a endereçar. Declaração de um ponteiro para tipo <tipo> <tipo> *<variável>; Exemplos /* apenas a é um ponteiro*/ int* a, b; /* c e d são ponteiros para floats */ float *c, *d; 8
9 Operador & O endereço de uma variável é obtido através do operador &. Exemplos int a = 43; /* um inteiro inicializado a 43 */ int* iptr; /* ponteiro para inteiro */ iptr = &a; /* iptr passa a guardar o endereço de a */ 9
10 Operador & O endereço de uma variável é obtido através do operador &. Exemplos int a = 43; /* um inteiro inicializado a 43 */ int *iptr; /* ponteiro para inteiro */ iptr = &a; /* iptr passa a guardar o endereço de a */ 10
11 Operador & O endereço de uma variável é obtido através do operador &. Exemplos (também poderia inicializar iptr na mesma linha): int a = 43; /* um inteiro inicializado a 43 */ int *iptr = &a; /* declaro um ponteiro para inteiro e esse ponteiro passa a guardar o endereço de a */ 11
12 Operador * O operador * permite aceder ao conteúdo de uma posição de memória endereçada pelo ponteiro (i.e., o conteúdo para onde um ponteiro aponta ). Exemplo: int a = 43; /* um inteiro inicializado a 43 */ int *iptr; /* ponteiro para inteiro */ int b; 12 iptr = &a; /* iptr passa a guardar o endereço de a */ b = *iptr; /* b passa a guardar o valor apontado por iptr*/
13 Operadores & e * Outro exemplo: #include <stdio.h> x 01 y 1 int main() { int y, x = 1; int *px; px px = &x; y = *px; *px = 0; printf("%d %d\n", x, y); return 0; 13
14 Operadores & e * Declaro dois inteiros, sendo x=1 Outro exemplo: #include <stdio.h> int main() { int y, x = 1; int *px; px é um ponteiro para inteiros... Mas ainda não guarda o endereço de nenhum Agora sim... px fica a guardar o endereço de x 14 px = &x; y = *px; *px = 0; printf("%d %d\n", x, y); return 0; Output: 0 1 y toma o valor guardado no endereço de memória guardado em px, i.e., o valor 1 Alteramos o conteúdo da posição de memória para onde px aponta, ou seja, vamos alterar o valor de x
15 Confusão habitual: utilizações do * (asterisco) Declaração do ponteiro int *x; x é um ponteiro para um inteiro Conteúdo da posição de memória apontada pelo ponteiro *x = 4; o valor 4 é atribuído ao conteúdo da posição de memória apontada por x 15
16 Utilização de Ponteiros O valor de retorno de uma função pode ser um ponteiro int* xpto(); O argumento de uma função pode ser um ponteiro int abcd(char *a, int *b); 16
17 Passagem de Parâmetros para Funções Em C os parâmetros são passados por valor void swap(int a, int b) { int aux; aux = a; a = b; b = aux; Chamada swap(x, y); A troca não é efectuada: Não funciona como necessário! 18
18 Passagem de Parâmetros para Funções Passagem por referência consegue-se enviando ponteiros void swap(int *a, int *b) { int aux; aux = *a; *a = *b; *b = aux; Chamada deverá ser swap(&x, &y) 19
19 Ponteiro Nulo / Endereço Zero Ponteiro especial para representar o endereço 0 int *ptr = NULL; Definido em stdlib.h Necessário #include <stdlib.h> Utilizado para indicar situações especiais Na realidade NULL == 0 20
20 Ponteiros e Tabelas Em C existe uma relação entre ponteiros e tabelas #include <stdio.h> int main() { int a[6] = {1, 2, 7, 0, 11, 6; int *pa = a; Os apontadores têm uma aritmética própria printf("%d %d %d\n", a[2], *(a+2), *(pa+2)); return 0; a é um ponteiro para a primeira posição da tabela 21
21 Ponteiros e Tabelas É possível efectuar + e - com ponteiros int x[10]; int *px = x; px X[0] 22
22 Ponteiros e Tabelas É possível efectuar + e - com ponteiros int x[10]; int *px = x; px++; px X[0] Incrementa/decrementa na dimensão do tipo para o qual aponta sizeof(int) neste caso 23
23 Ponteiros e Tabelas Em C existe uma relação entre ponteiros e tabelas #include <stdio.h> int main() { int a[6] = {1, 2, 7, 0, 11, 6; int *pa = a; printf("%d %d %d\n", a[2], *(a+2), *(pa+2)); return 0; a é um ponteiro para a primeira posição da tabela 24
24 Ponteiros e Tabelas A declaração int *p1; declara o mesmo que int p2[]; p1 pode ser alterado p2 não pode ser alterado int p2[]; só pode ser utilizado em certos casos A declaração int p3[100]; declara uma tabela com 100 inteiros e aloca memória na quantidade necessária p3 não pode ser alterado A declaração char *text; não aloca qualquer memória no entanto char *text = "ola"; aloca; 25
25 Ponteiros e Tabelas Qual a diferença entre as duas declarações seguintes? char t1[] = "ola"; char *t2 = "ola"; Ambas alocam 4 bytes e copiam para essa posição de memória a sequência de caracteres 'o','l','a','\0' Em ambos os casos é possível modificar o conteúdo da memória alocada Não é possível alterar o valor de t1, ou seja não é possível pôr t1 a endereçar outra posição de memória É possível alterar o valor de t2 26
26 Exercício Seja float a[100]; float *p=a; então a[i] é equivalente a *(a+i) V &a[i] é equivalente a a+i a[i] é equivalente a p[i] p[i] é equivalente a *(p+i) V V V *a? a é equivalente a p[0] F a[0]? 27
27 Ponteiros e Tabelas Exemplo: cópia de strings void strcpy(char s[], char t[]) { int i = 0; while ((s[i] = t[i])!= \0 ) i++; 28
28 Ponteiros e Tabelas Exemplo: cópia de strings void strcpy(char *s, char *t) { int i = 0; while ((s[i] = t[i])!= \0 ) i++; void strcpy(char *s, char *t) { while ((*(s+i) = *(t+i))!= \0 ) i++; 29
29 Ponteiros e Tabelas Exemplo: cópia de strings void strcpy(char *s, char *t) { void strcpy(char *s, char *t) { while ((*(s+i) = *(t+i))!= \0 ) while ((*s = *t)!= \0 ) { i++; s++; t++; 30
30 Ponteiros e Tabelas Exemplo: cópia de strings void strcpy(char *s, char *t) { while ((*s = *t)!= \0 ) { s++; t++; void strcpy(char *s, char *t) { while ((*s++ = *t++)!= \0 ); 31
31 Ponteiros e Tabelas Exemplo: cópia de strings void strcpy(char *s, char *t) { void strcpy(char *s, char *t) { while ((*s++ = *t++)!= \0 ); while ((*s++ = *t++)); Porquê? 32
32 Passagem de Parâmetros para Funções II Quando fazemos int a; scanf( %d,&a); o que estamos a passar ao scanf? char s[100]; scanf( %s,s); Porque não precisamos do &? 33
33 Passagem de Parâmetros para Funções II Passagem por referência consegue-se enviando ponteiros void levector(int *v, int tamanho) { int i; for (i=0 ; i<tamanho ; i++) scanf( %d,&v[i] Podemos escrever o argumento como int*v ou int v[] Como v já é um endereço podemos alterar o v dentro da função. 34
34 Endereços de ponteiros É possível declarar um ponteiro para um ponteiro #include <stdio.h> int main() { int x = 10; int *px = &x; int **ppx = &px; printf("%d %d %d\n", x, *px, **ppx); return 0; 35
35 Argumentos da Linha de Comandos argv[0] é o nome o programa argv[i] é i-ésimo argumento Programa escreve" $ escreve hello world gera hello world int main(int argc, char *argv[]) { int i; for(i=1; i < argc; i++) printf("%s ", argv[i]); printf("\n"); return 0; array de pointers Tamanho do array (número de argumentos introduzidos) 36
36 1ª nota Ao fazer int *a; apenas estamos a reservar memória para 1 endereço de memória e não para um inteiro. Por esta razão, não devemos inicializar o conteúdo de um ponteiro sem que saibamos exactamente onde ele está a escrever. Ex.: int *a; *a=12; /* A evitar!!! */ 37
37 2ª nota: Ponteiros para Funções É possível ter ponteiros para funções O nome de uma função é um ponteiro para essa função int soma(int a, int b) { return a+b; int main() { int (*ptr)(int, int); ptr = soma; printf("%d\n", (*ptr)(3,4)); return 0; 38
38 2ª nota: Ponteiros para Funções (2º exemplo) É possível ter ponteiros para funções O nome de uma função é um ponteiro para essa função int modulo(int a) { return a < 0? a : a; int dobro(int a) { return a*2; void escreve(int (*func)(int), int valor){ 39 printf( %d\n,(*func)(valor)); int main() { int x = -10; int (*f)(int); f = modulo; escreve(f,x); return 0;
O que é um apontador em C (type pointer in C)?
O que é um apontador em C (type pointer in C)? Um apontador é uma variável que contém um endereço de outra variável. int x = 10;//variável inteira iniciada com o valor 10 int *px = &x;//variável apontadora
Aula 17: Ponteiros e Alocação Dinâmica em C
Aula 17: Ponteiros e Alocação Dinâmica em C Fernanda Passos Universidade Federal Fluminense Programação de Computadores IV Fernanda Passos (UFF) Ponteiros e Alocação Dinâmica Programação de Computadores
A sintaxe para se declarar uma variável do tipo ponteiro é dada por:
Pense duas vezes e faça uma vez. Provérbio Chinês. PONTEIROS Um ponteiro nada mais é que uma variável capaz de armazenar um número hexadecimal que corresponde a um endereço de memória de outra variável.
Ponteiros e Alocação de Memória
Algoritmos e Estrutura de Dados I Ponteiros e Alocação de Memória Prof. Paulo Henrique Pisani fevereiro/2019 Memória Podemos entender a memória como um grande vetor de bytes devidamente endereçados: 0x1051
ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória
ALGORITMOS E ESRUTRA DE DADOS I Ponteiros Passagem por Valor e Referência Alocação de Memória 2 Agenda Ponteiros Conceitos gerais O que é Ponteiro? Declaração de Ponteiros Operadores para Ponteiros Exemplos
3. Linguagem de Programação C
Introdução à Computação I IBM1006 3. Linguagem de Programação C Prof. Renato Tinós Departamento de Computação e Matemática (FFCLRP/USP) 1 Principais Tópicos 3.5. Vetores 3.5.1. Vetores 3.5.2. Strings 3.5.3.
1 Exercícios com ponteiros
Computação para Informática Funções e Ponteiros1 EXERCÍCIOS COM PONTEIROS Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Funções e ponteiros O objetivo desta aula prática
Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C
Estruturas de Dados Revisão de Ponteiros Prof. Ricardo J. G. B. Campello Sumário Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C Operações Ponteiros e Arranjos
Alocação Dinâmica em C
Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação Alocação Dinâmica em C Profa Rosana Braga Adaptado de material preparado pela profa Silvana Maria Affonso de Lara
Estrutura de dados 2. Ponteiro. Prof. Jesuliana N. Ulysses
1 3 Estrutura de dados 2 Ponteiro Ponteiro 2 O ponteiro é um tipo de dado como int, char ou float. A diferença do ponteiro ponteiro guardará um endereço de memória. Por meio deste endereço pode-se acessar
Programação 11543: Engenharia Informática 6619: Tecnologias e Sistemas de Informação. Cap. 8 Endereçamento de Memória Endereçamento de Memória
Programação 11543: Engenharia Informática 6619: Tecnologias e Sistemas de Informação Cap. 8 Endereçamento de Memória Endereçamento de Memória Sumário: O que nós já sabemos sobre endereçadores (ou apontadores
1/34 GESTÃO DINÂMICA DE MEMÓRIA
1/34 GESTÃO DINÂMICA DE MEMÓRIA Memória Estática 2/34 Memória Estática Exemplo #include main() { int V[300], N; do{ printf ( N =? ); scanf ( %d, &N); while ((N < 0) (N > 300); for (i = 0; i
Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?
Introdução à Ciência da Computação Ponteiros em C Prof. Ricardo J. G. B. Campello Sumário Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C Operações Ponteiros
Ponteiros - Parte I. Ponteiros, Ponteiros e Vetores, Algoritmo Bubble Sort, Alocação Dinâmica de Memória
Ponteiros - Parte I Ponteiros, Ponteiros e Vetores, Algoritmo Bubble Sort, Alocação Dinâmica de Memória Ponteiros Um ponteiro é uma variável que contém um endereço de memória. Esse endereço é normalmente
Alocação Dinâmica de Memória
Alocação Dinâmica de Memória Luiz Chaimowicz, Raquel O. Prates, Pedro O.S. Vaz de Melo Algoritmos e Estruturas de Dados II DCC UFMG Alocação Estática x Dinâmica C: dois tipos de alocação de memória: Estática
Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ
Ponteiros em C Adriano Joaquim de Oliveira Cruz 21 de julho de 2017 Instituto de Matemática Departamento de Ciência da Computação UFRJ 1 Resumo da Seção Introdução Declaração Incrementando e Decrementando
Introdução à Programação em C Input / Output
Introdução à Programação em C Input / Output Resumo Aula Anterior Programa começa com função main() Sintaxe para definição de funções Definição de variáveis e atribuições Estruturas de controlo if-then
Métodos Computacionais. Vetores e Matrizes Dinâmicas
Métodos Computacionais Vetores e Matrizes Dinâmicas Vetores Um programa para o cálculo da média Média m n i= = 1 n x i Variância v n i= = 1 ( x i n m) 2 A forma mais simples de estruturar um conjunto de
ponteiros INF Programação I Prof. Roberto Azevedo
ponteiros INF1005 -- Programação I -- 2016.1 Prof. Roberto Azevedo [email protected] ponteiros tópicos o que são ponteiros operadores usados com ponteiros passagem de ponteiros para funções referência
ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal
ALGORITMOS AULA 01 Baseado nas aulas do Prof. Jorgiano Vidal LINGUAGEM C Uma das grandes vantagens do C é que ele possui tanto caracterìsticas de "alto nìvel" quanto de "baixo nìvel". Linguagem de propósito
Estruturas de Dados Aula 6: Cadeias de 28/03/2010
Estruturas de Dados Aula 6: Cadeias de Caracteres 28/03/2010 Caracteres Caracteres são representados internamente por códigos numéricos Tipo char (inteiro pequeno ) 1 byte (8 bits) 256 caracteres possíveis
Introdução a Programação. Tipos Estruturados de Dados
Introdução a Programação Tipos Estruturados de Dados Tópicos da Aula Hoje aprenderemos a trabalhar com tipos de dados mais complexos Tipos Primitivos x Tipos Estruturados Conceito de Tipos Estruturados
Estruturas Dinâmicas - Ponteiros
SSC0800 - ICC1 Teórica Introdução à Ciência da Computação I Estruturas Dinâmicas - Ponteiros Prof. Claudio Fabiano Motta Toledo: [email protected] Sumário Ponteiros Ponteiros e Vetores Funções para alocação
Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica
Universidade Federal de Uberlândia Faculdade de Computação Linguagem C: ponteiros e alocação dinâmica Prof. Renato Pimentel 1 Ponteiros 2 Prof. Renato Pimentel 1 Ponteiros: introdução Toda a informação
Tipos Abstratos de Dados. Estrutura de Dados
Tipos Abstratos de Dados Tipo Abstrato de Dados ou TAD Idéia principal: desvincular o tipo de dado (valores e operações) de sua implementação: O que o tipo faz e não como ele faz! Vantagens da desvinculação:
Estrutura de dados 1. Ponteiros
Estrutura de dados 1 Ponteiros Ponteiros Um ponteiro é um endereço de memória O valor de um ponteiro indica onde uma variável está armazenada Um ponteiro proporciona um modo de acesso a uma variável sem
Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros
Métodos Computacionais Funções, Escopo de Variáveis e Ponteiros Tópicos da Aula Hoje vamos detalhar funções em C Escrevendo funções Comando return Passagem de argumentos por valor Execução de uma função
Módulo 5 Vetores e Alocação Dinâmica
Estruturas de Dados Módulo 5 Vetores e Alocação Dinâmica 1/9/2005 (c) Dept. Informática - PUC-Rio 1 Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora
Linguagem C. André Tavares da Silva.
Linguagem C André Tavares da Silva [email protected] Variáveis Posição nomeada de memória que é usada para guardar um valor que pode ser modificado pelo programa. Todas as variáveis devem ser
Vetores e Matrizes. Prof. Fabrício Olivetti de França Charles Henrique
Vetores e Matrizes Prof. Fabrício Olivetti de França Charles Henrique Vetores Estáticos Um vetor em C é declarado como: tipo nome[tamanho]; 2 Vetores Estáticos /* vetor de nome v1 com 100 elementos do
1 Exercícios com ponteiros
Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Oitava Aula Prática - 29 de outubro de 2010 O objetivo desta aula prática é exercitar ponteiros e funções. 1 Exercícios com ponteiros
Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica
Introdução a Programação Ponteiros e Vetores, Alocação Dinâmica Tópicos da Aula Hoje aprenderemos que existe uma forte relação entre ponteiros e vetores Associação entre ponteiros e vetores Ponteiros constantes
Programação: Vetores
Programação de Computadores I Aula 09 Programação: Vetores José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011-1 1/62 Motivação Problema Faça um programa que leia
Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória
Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP Alocação Dinâmica de Memória Alocação Estática x Dinâmica C: dois tipos de alocação de memória: Estática e Dinâmica Na alocação estática, o espaço
INTRODUÇÃO À LINGUAGEM C. Prof. Msc. Luis Filipe Alves Pereira 2015
INTRODUÇÃO À LINGUAGEM C Prof. Msc. Luis Filipe Alves Pereira 2015 INTRODUÇÃO À LINGUAGEM C 02/23 INTRODUÇÃO Criada em 1972 na AT&T Bell Labs É uma das linguagens mais populares. Existem poucas arquiteturas
Métodos Computacionais. Tipos Estruturados
Métodos Computacionais Tipos Estruturados Tipos Estruturados C oferece tipos primitivos que servem para representar valores simples Reais (float, double), inteiros (int), caracter (char) C oferece também
Ponteiros. Introdução e Alocação Dinâmica
Ponteiros Introdução e Alocação Dinâmica Conceito Um PONTEIRO ou APONTADOR é uma variável usada para armazenar um endereço de memória. Normalmente, o endereço armazenado em um PONTEIRO é a posição de uma
REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos
REVISÃO DE C Vanessa Braganholo Estruturas de Dados e Seus Algoritmos REVISÃO DE C Ponteiros Alocação dinâmica de memória Recursão INSTITUTO DE COMPUTAÇÃO - UFF 2 PONTEIROS PONTEIROS C permite o armazenamento
LINGUAGEM C: PONTEIROS
LINGUAGEM C: PONTEIROS Prof. André Backes DEFINIÇÃO Variável É um espaço reservado de memória usado para guardar um valor que pode ser modificado pelo programa; Ponteiro É um espaço reservado de memória
Introdução a Programação de Jogos
Introdução a Programação de Jogos Aula 03 Introdução a Linguagem C Edirlei Soares de Lima Estrutura de um Programa C Inclusão de bibliotecas auxiliares: #include Definição
