Introdução à Computação

Documentos relacionados
3. Linguagem de Programação C

3. Linguagem de Programação C

1. Revisão de Vetores, Ponteiros, Funções e Estruturas em C

Centro Universitário Franciscano Curso de Sistemas de Informação Disciplina de algoritmos e programação II. Ponteiros

Programação: Vetores

Ponteiros e Tabelas. K&R: Capítulo 5

3. Linguagem de Programação C

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Ponteiros. Introdução e Alocação Dinâmica

Aula 17: Ponteiros e Alocação Dinâmica em C

Computação Eletrônica. Vetores e Matrizes. Prof: Luciano Barbosa. CIn.ufpe.br

SSC304 Introdução à Programação Para Engenharias. Ponteiros. GE4 Bio

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

LINGUAGEM C: ARRAY: VETORES E MATRIZES

Algoritmos e Programação

Estruturas de Dados. Profa. Juliana Pinheiro Campos

Aula 06 Introdução à Programação Matrizes

Programação Estruturada

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Computação 2. Aula 7. Profª. Fabiany Ponteiros

Matrizes em C. Lucas Ferrari de Oliveira Professor Adjunto. Universidade Federal do Paraná

prim = A ; prim = &A[0];

Ponteiros. Introdução

Introdução à Linguagem C

3. Linguagem de Programação C

Introdução à Computação

Introdução à Ciência da Computação. Sumário. Estruturas de Dados. Agradecimentos. Arranjos: Vetores, Strings & Matrizes em C

ESTRUTURA DE DADOS (TCC )

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Linguagem C ponteiros

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Alocação Dinâmica em C

Linguagem C: Ponteiros. Prof. Tiago Alves de Oliveira

ponteiros INF Programação I Prof. Roberto Azevedo

Algoritmos II prof. Daniel Oliveira

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Linguagem C: Ponteiros. Prof. Leonardo Barreto Campos 1

Introdução. Ponteiros

Algoritmos e Programação

Vetores. e o programa deverá ler os valores separadamente:

Linguagens de Programação I

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Linguagem C: Introdução

ESTRUTURAS COMPOSTAS

Hello World. Linguagem C. Tipos de Dados. Palavras Reservadas. Operadores Aritméticos. Pré e pós incremento e pré e pós decremento

LINGUAGEM C: PONTEIROS

TÉCNICAS DE LINGUAGEM DE PROGRAMAÇÃO

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica

Aula 03: Introdução a C

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

Linguagem de Programação I. Aula 08 Linguagem C: Arrays

3. Linguagem de Programação C

Estruturas Dinâmicas - Ponteiros Parte I

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

Estrutura de dados 1. Ponteiros

Programação I Matrizes e Strings. Prof. Carlos Alberto

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Programação Estruturada

A sintaxe para se declarar uma variável do tipo ponteiro é dada por:

Estruturas de Dados Aula 2: Estruturas Estáticas. Tipos Básicos. Quantos valores distintos podemos representar com o tipo char?

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

Capítulo 2 Operadores. A função scanf()

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Introdução a Programação. Ponteiros e Passagem de Argumentos por Referência

Ponteiros e alocação dinâmica de memória. Disciplina de Programação de Computadores I Universidade Federal de Ouro Preto

Estrutura de dados 2. Ponteiro. Prof. Jesuliana N. Ulysses

FUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara

Essencialmente, um ponteiro nada mais é do que uma variável que ao invés de conter um valor, contém um endereço de memória.

Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores

Ponteiros. Baseado nos slides do Prof. Mauro.

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

INF 1007 Programação II

Aula 25: Alocação Dinâmica

Conceitos básicos de programação

Curso de Programação C em Ambientes Linux Aula 04

Introdução à Computação MAC0110

Introdução à Programação

Caracteres e Cadeias de Caracteres

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

O que é um apontador em C (type pointer in C)?

Programação C/C++ Slide 5 Nielsen Castelo Damasceno

O vetor é provavelmente um dos mais simples e importantes tipos agregados. Através do seu uso, podemos

Variáveis, Comandos de Atribuição e Comando de Entrada e Saída

Introdução à Linguagem C

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

11a. Aula Ponteiros e Vetores

Tipos de Dados, Variáveis e Entrada e Saída em C. DCC 120 Laboratório de Programação

Funções em Linguagem C Parte II

EXERCÍCIO DE SONDAGEM TURMA 02 SEMESTRE DATA: 01/11/2016. Matrícula Nome Nota

CCO 016 / COM 110 Fundamentos de Programação

Introdução a Programação de Jogos

ESTRUTURAS COMPOSTAS VETOR

Introdução a Computação

Caracteres. Caracteres são representados através de códigos numéricos. Tabela de códigos: Define correspondência entre caracteres e códigos numéricos

Métodos Computacionais

Matrizes. DCC 119 Algoritmos

Transcrição:

Introdução à Computação Linguagem C Aula de hoje Introdução Vetores (revisão) Relacionamento entre vetores e ponteiros Professor: André de Carvalho Definição: coleção de valores de dados individuais com as seguintes características: É ordenado: os elementos de um vetor podem ser contados de forma ordenada É homogêneo: Todo valor armazenado em um mesmo vetor deve ser do mesmo tipo Ex: vetor de inteiros só pode ter elementos do tipo inteiro Pode-se pensar em um vetor como uma seuência de caixas, uma para cada valor Cada um dos valores é chamado de elemento Ex: Vetor possui duas propriedades fundamentais Tipo de elemento Tamanho do vetor Declaração type name[size] Ex: int vetor[10]; Tamanho do vetor deve ser especificado como uma constante Facilita mudança do tamanho Ex: #define NElementos 10 int vetor[nelementos]; Declaração (cont) Cada elemento de um vetor é identificado por um índice Começa com o valor 0 e termina com um valor igual ao número de elementos - 1 Ex vetor de 4 elementos possui os índices 0, 1, 2, 3 1

Declaração (cont) Nome do vetor deve indicar ao usuário ue tipo de valor está sendo armazenado Ex #define NJuizes 5 double notas[njuizes]; notas Para se referir a um elemento específico de um vetor, devem ser fornecidos: Nome do vetor Índice correspondente à posição do elemento referenciado dentro do vetor Ex: A nota do segundo juiz é dada por notas[1] 0 1 2 3 4 Definições importantes Seleção: processo de identificar um elemento Expressão com seleção: resultado da seleção Ex: vetor[indice]; Expressão com seleção Funciona como uma simples variável Ex: nota[2] = 94; notas Índice de um elemento 94 0 1 2 3 4 Valor de um elemento Índice = 2 Valor = 94 Expressão com seleção É possível mudar os valores em um vetor, mas nunca o seu tamanho Valor do índice não precisa ser uma constante Pode ser ualuer expressão cujo resultado é um tipo escalar (int, short, long, char) for (i = 0; i < Njuizes; i++){ notas[i] = 00; Tamanho efetivo e tamanho alocado Muitas vezes não se sabe uantos elementos o vetor vai conter Estratégia utilizada: Declarar tamanho como o número máximo de elementos possível (tamanho alocado) Declarar um inteiro para indicar número de elementos utilizados (tamanho efetivo) Lembrar: Tamanho do vetor deve ser constante Ex: int val_dados [n]; /* n não pode ser uma variável */ 2

Passagem de vetores como parâmetros Em C, vetores inteiros podem ser passados como parâmetro Tamanho do vetor não precisa ser informado na declaração da função Passar junto uma variável com o tamanho Funciona como passagem por referência Alteração em um valor do parâmetro, muda automaticamente o valor correspondente no argumento Passagem por valor main () { int anos, maior; anos = 20; maior = aaa (anos); printf ( %d %d, anos, maior); int aaa (int idade) { if idade > 18 return 1; else return 0; idade = 45; printf ( %d, idade); Passagem por valor Passagem por referência main () { int anos, maior; anos = 20; maior = aaa (anos); printf ( %d %d, anos, maior); Imprime: 20 1 int aaa (int idade) { if idade > 18 return 1; else return 0; idade = 45; printf ( %d, idade); Imprime: 45 main () { int notas[2], final; notas[0] = 10; notas[1] = 8 final = aaa (notas); printf ( Notas: %d %d, notas[0], final); int aaa (int val[]) { int media; if val[0] < 5 media = val[0]; else if val[1] < 5 media = val[1]; else media = (val[0]+val [1])/2; val[0] /= 2; return media; Passagem por referência main () { int notas[2], final; notas[0] = 10; notas[1] = 8 final = aaa (notas); printf ( Notas: %d %d, notas[0], final); Imprime: 5 9 int aaa (int val[]) { int media; if val[0] < 5 media = val[0]; else if val[1] < 5 media = val[1]; else media = (val[0]+val [1])/2; val[0] /= 2; return media; double media (double ind_notas[], int n){ int i; double total = 00; for (i = 0; i < n; i++){ total += ind_notas[i]; return (total / n); 3

Inicialização de vetores Valores iniciais podem ser atribuídos a uma variável do tipo vetor uando da sua declaração Ex: int digitos[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Neste caso, o tamanho do vetor pode ser omitido Ex: int digitos[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Compilador reserva para o vetor um número de elementos igual ao número de valores da lista inicializadora Facilita a manutenção do programa Inicialização de vetores Ex: static string CidadesGrandes [] = { Rio, Sao Paulo, Belo Horizonte, Porto Alegre, Salvador, Curitiba, Recife, Fortaleza ; Alternativa: Ex: static string CidadesGrandes [] = { Rio, Sao Paulo, Belo Horizonte, Porto Alegre, Salvador, Curitiba, Recife, Fortaleza, ; Vírgula no final facilita adição e eliminação de cidades sem alterar as entradas existentes na lista de inicializadores Inicialização na declaração Com menos elementos ue o tamanho do array Elementos restantes são automaticamente inicializados com 0 (ou 00) Ex: int vet[10] = {2 Com mais elementos ue o tamanho do array Provoca um erro de sintaxe Ex: int vet[3] = {2, 4, 3, 1 int val[100]; int i; for (i = 0; i < 100; ++i){ val[i] = i; Tamanho atual do vetor em bytes: sizeof(tipo base) * tamanho do vetor A Linguagem C não checa de você passou dos limites de um vetor Se passar do fim de um vetor, programa pode: Escrever em cima dos conteúdos das posições nos extremos do array Escrever no espaço reservado para outras variáveis Escrever no espaço reservado para o código do programa 4

Exercício Escrever programa em C ue calcula notas de uma pessoa em um concurso Inicializar nota de 10 juízes com valor 00 Ler da tela a nota dada por cada juiz Calcular soma, nota máxima e nota média Imprimir resultados na tela Vetores multi-dimensionais (matrizes) Quando os elementos de um vetores são vetores Vetores bidimensionais (matrizes) são a forma mais comum Ex: double mat [3][3]; mat[0][0] mat[0][1] mat[0][2] mat[1][0] mat[1][1] mat[1][2] mat[2][0] mat[2][1] mat[2][2] mat [0] mat [1] mat [2] { { { mat [0] [0] mat [0] [1] mat [0] [2] mat [1] [0] mat [1] [1] mat [1] [2] mat [2] [0] mat [2] [1] mat [2] [2] Internamente, C representa mat como um vetor de três elementos Cada elemento é um vetor de três valores ponto-flutuantes Na memória, estes nove valores formam uma lista unidimensional Vetores multidimensionais Podem ser passados como parâmetros Deve ser especificado tamanho de cada índice (a menos do primeiro índice) É um bom estilo de programação especificar o tamanho de todos os índices Tamanho em bytes de um vetor bidimensional tamanho do indice1 * tamanho do indice2 * sizeof (tipo base) Vetores multidimensionais Podem ser inicializados na declaração Para enfatizar a estrutura geral, valores de cada vetor interno são inicializados entre chaves static double ident [3][3] = { {10, 00, 00, {00, 10, 00, {00, 00, 10 ; 10 00 00 00 10 00 00 00 10 int t, i, num[3][4]; for(t=0; t<3; ++t) for(i=0; i<4; ++i) num[t][i] = (t*4)+i+1; for(t=0; t<3; ++t) { for(i=0; i<4; ++i) printf("%3d ", num[t][i]); printf("\n"); 5

#define MAX 100 #define LEN 80 char text[max][len]; int t, i, j; printf("entre com uma linha vazia para sair\n"); for(t=0; t<max; t++) { printf("%d: ", t); gets(text[t]); if(!*text[t]) break; /* sai com linha em branco */ for(i=0; i<t; i++) { for(j=0; text[i][j]; j++) putchar(text[i][j]); putchar('\n'); Em C, entender vetores ajuda a entender ponteiros, e vice-versa Vetores são implementados internamente como ponteiros Operações sobre ponteiros só fazem sentido se forem consideradas em relação a vetores É importante considerar estes dois conceitos juntos Variável ue contém um endereço de memória Este endereço é geralmente a posição de uma outra variável na memória Diz-se x aponta para y Quando a variável x contém o endereço da variável y Endereço 1000 1008 1016 1024 1032 1040 1048 1056 1024 Valor de uma variável do tipo ponteiro Memória Variáveis ponteiros devem ser declaradas como tal tipo-base *nome-da-variavel O tipo base do ponteiro define ue tipo de variáveis o ponteiro pode apontar Tecnicamente, ponteiro de ualuer tipo base pode apontar para ualuer lugar na memória Aritmética de ponteiros é feita pelo tipo base, assim é importante declarar o ponteiro corretamente int *p, = 20; p = &; += *p; 6

int *p, ; ind p 1 ind int *p, ; ind p 1 2 ind p 20 = 20; p = &; += *p; = 20; p = &; += *p; int *p, ind p 1 2 ind p 20 int *p, p 1 2 ind p 20 = 20; p = &; += *p; p 20 = 20; p = &; += *p; p 20 p 40 3 3 4 float x, y; int *p; p = &x; y = *p; Não produz o resultado desejado Chamada por valor int valor_ao_cubo (int); main (){ int num = 3; printf ( Valor inicial de num eh %d\n, num); num = valor_ao_cubo (num); printf ( Novo valor de num: %d\n, num); int valor_ao_cubo (int n){ return (n * n * n); 7

Chamada por referência Chamada por valor X por referência int valor_ao_cubo (int *); main (){ int num = 3; printf ( Valor inicial de num eh %d\n, num); valor_ao_cubo (&num); printf ( Novo valor de num: %d\n, num); int cubo_ao_cubo (int *n){ *n = *n * *n * *n; return; int valor_ao_cubo (int); main (){ int num = 3; printf ( Valor inicial de num eh %d\n ); num = valor_ao_cubo (num); printf ( Novo valor de num, %d\n, num); int valor_ao_cubo (int n){ return (n * n * n); int valor_ao_cubo (int *); main (){ int num = 3; printf ( Valor inicial de num eh %d\n ); valor_ao_cubo (&num); printf ( Novo valor de num: %d\n, num); int cubo_ao_cubo (int *n){ *n = *n * *n * *n; return; Exercício Escrever um programa ue calcula o MDC de dois números Usando chamada por valor Usando chamada por referência Dica Int mdc (int a, b) { int aux; if (a < b) { aux = a; a = b; b = aux; while (b > 0){ aux = b b = a % b; a = aux return (a); Operadores de ponteiros Operador unário & fornece o endereço na memória de seu operando (variável ou constante) Ex: m = &val; & pode ser lido como endereço de Operador unário * é o complemento de & Devolve o valor da variável armazenada no endereço ue o segue Ex: x = *end; * pode ser lido como no endereço int x = 8; int *p1, *p2; p1 = &x; p2 = p1; printf("%p", p2); Imprime: O endereço de x! 8

int x, y; int *p1; x = 10; p1 = &x; y = *p1; printf("%d", y); Imprime: O valor de x! int x, *p, **; x = 10; p = &x; = &p; printf("%d", **); Imprime: O valor de x! Exercício Exercício Definir o ue acontece a cada linha: int x = 4, y = 2; int *ap; ap = &x; y = *ap; *ap += 5; ap = &y *ap = y +1; Desenhe diagramas mostrando os conteúdos de memória depois de cada linha do código a seguir: int x, y, *p, *; x = 10; y = 25; p = &x; = &y; *p += *; = p; * = *p + 10; p++; Cada tipo base ocupa um tamanho de memória diferente char: 8 bits (1 byte) int: 16 ou 32 bits (2 ou 4 bytes) short int:16 bits (2 bytes) long int: 32 bits (4 bytes) float 32 bits (4 bytes) double 64 bits (8 bytes) long double 80 bits (10 bytes) Relacionamento entre ponteiros e vetores Em C, o nome de um vetor tem como valor o endereço do seu primeiro elemento Ex: int lista[5]; x = lista é idêntico a x = &lista[0] Nome de um vetor euivale a um ponteiro para o primeiro elemento do vetor Nome de um vetor pode ser atribuído a uma variável do tipo ponteiro Usado uando um vetor é passado como argumento para uma função 9

Exercício sum = Soma (int vetor[], int n); int Soma (int vetor[], int n) { int i, soma; soma = 0; for (i = 0; i < n; i++){ soma += vetor[i]; return (soma); int Soma (int *vetor, int n){ Euivalentes O ue faz a função abaixo? int Soma (int *ip, int n) { int i, soma; soma = 0; for (i = 0; i < n; i++){ soma += *ip++; return (soma); Relacionamento entre ponteiros e vetores Para o compilador, não existe diferença entre vetor e ponteiro uando eles são passados como parâmetros Dentro da lista de parâmetros, declarações vetor[] e *vetor são euivalentes Ambas são ponteiros Declaração de parâmetros deve refletir o seu uso Se uma função recebe um vetor de uma dimensão, o parâmetro formal pode ser declarado de três formas: func (int *x){ func (int x[10]){ func (int x[]){ Os três métodos de declaração têm o mesmo resultado Cada um deles avisa ao compilador ue um apontador para inteiro será recebido Primeira declaração usa um ponteiro Segunda declaração usa uma declaração padrão de array Terceira declaração avisa ue um array do tipo int de tamanho indefinido será recebido Valor entre colchetes é ignorado pelo compilador Uma declaração do tipo: func (int val[32]){ Teria o mesmo funcionamento Compilador gera código instruindo func() a receber um ponteiro Não cria um array com 32 elementos 10

Exercício Escrever um programa em C ue chama uma função ue troca o valor de duas variáveis do programa principal : Antes da chamada: x = 3 e y = 5 Depois da chamada: x = 5 e y = 3 Diferença entre ponteiros e vetores ocorre na alocação de memória durante a declaração Ex: int vet[5]; Reserva 5 posições consecutivas Cada uma capaz de armazenar um valor do tipo inteiro Ex: int *p; Reserva apenas uma posição Suficiente para armazenar um endereço de memória Como usar um ponteiro como um vetor? Atribuir ao ponteiro o endereço base do vetor Ex p = vet; /*p e vet se tornam sinônimos */ Por ue fazer isso, se o próprio nome do vetor pode ser utilizado? Ponteiro pode ser inicializado para uma nova memória ue ainda não foi utilizada Permite a criação de novos vetores durante execução do programa (alocação dinâmica) Funcionamento do tipo vetor Ex: double lista [3]; Reserva espaço para três variáveis do tipo double (tipo double ocupa 8 bytes) Cada elemento de um vetor é um valor O vetor lista tem um endereço Endereço pode ser definido com o operador & 1000 1008 1016 lista [0] lista [1] lista [2] Funcionamento do tipo vetor Ex: &lista[1] tem o valor 1008, endereço do elemento lista[1] Valor do índice não precisa ser constante Conteúdo de lista[i] é um valor É permitido escrever &lista[i] (indica o endereço do i-ésimo elemento da lista) Funcionamento do tipo vetor Endereço do i-ésimo elemento depende do tipo base e do valor da variável i Compilador C não pode definir este endereço durante a compilação Gera instruções ue adicionam ao endereço base do vetor i vezes o tamanho de cada elemento em bytes Ex: &lista [i] == 1000 + i*8 Cálculo é feito automaticamente pelo compilador 11

Aritmética de ponteiros Em C, operadores + e - podem ser aplicados a ponteiros Se p é um ponteiro para o elemento inicial de um vetor vet e k é um inteiro, então: p + k é definido como &vet[k] *(p + k) é o valor armazenado no endereço (p + k) Depende do tipo base *(p + 4) == vet[4] Exercício O ue acontece após os comandos abaixo? int x = 2, vet[10]; int *ap; ap = &x; vet[2] = vet[0] = 2; vet[1] = *vet + 1; x += *(vet + x); int *p, val[10]; p = val; p[5] = 20; /* atribui usando indice */ /* ponteiros podem ser indexados como vetores */ *(p + 5) = 20 /* atribui usando aritmética de ponteiros */ Sejam as declarações: double lista [3]; double *p; 1000 1008 1016 lista [0] lista [1] lista [2] Ambas as operações atribuem o valor 20 ao sexto elemento de val 1024 p Sejam as atribuições: lista [0] = 10; lista [1] = 17; lista [2] = 13; p = &lista [0]; 1000 1008 1016 xxxx 10 17 13 1000 lista [0] lista [1] lista [2] p Seja a operação: p = p + 2; Variável p passa a apontar para o elemento duas posições adiante no vetor Para cada unidade adicionada a p, seu valor numérico interno é acrescido de 8 Aritmética leva em conta o tamanho do tipo base 1000 1008 1016 xxxx 10 17 13 1016 lista [0] lista [1] lista [2] p 12

Aritmética de ponteiros Operações /, * e % não podem ser usadas com operandos do tipo ponteiro não podem ser somados podem ser subtraídos A operação de subtração ocorre de forma semelhante à subtração de inteiros Operação retorna o número de elementos entre os dois ponteiros #include <stringh> void imprime_string (char *p){ int t; printf(p); for(t=strlen(p)-1; t>-1; t--) printf("%c", p[t]); Imprime o conteúdo da string normal e de trás para frente podem ser decrementados e incrementados Ex: *p++; 1 De-referencia o apontador e retorna como valor o objeto para o ual ele aponta 2 Incrementa valor de p (efeito colateral) Se o valor anterior era um elemento de um vetor, p passa a apontar para o próximo elemento do vetor Matrizes de Assim como ualuer outro tipo de dados, ponteiros podem ser organizados em matrizes Ex: int *x[10], var = 3; x[2] = &var /* atribui o endereco de var a x[2] */ *x[2] /* retorna o valor de var */ Matriz de ponteiros pode ser passada como argumento para uma função Matrizes de void mostra_array (int *[]){ int t; for (t = 0; t < 10; t++) printf ( %d, *[t]); Obs: é um ponteiro para uma matriz de ponteiros para inteiros Matrizes de ponteiros são geralmente usadas como ponteiros para strings void mensagem_erro (int num){ static char *erro[] = { Aruivo não pode ser aberto\n, Erro de leitura\n, Erro de escrita\n, Erro da midia\n ; printf ( %s, erro[num]); 13

Inicialização de Após um ponteiro ser declarado, enuanto um valor não lhe for atribuído, ele contém um valor desconhecido Ponteiro recebe o valor NULL (nulo, euivale a 0) Não aponta para nada Não deve ser deferenciada com o operador * Tentar atribuir o valor desta variável para uma outra provavelmente leva a erro de execução Mas é possível usar o valor nulo Pode ser usado para indicar final de uma matriz de ponteiros /* Procura por um nome */ procura (char *p[], char *nome){ int t; for (t = 0; p[t]; ++t) if (! strcmp (p[t], nome)) return t; return -1; /* nome não foi encontrado */ #include "stringh" #include "stdioh" char *p1; char s[80]; do { p1 = s; gets(s); /* le uma string */ /* imprime o euivalente decimal de cada caractere */ while(*p1) printf(" %d", *p1++); while (strcmp(s, "fim")); Conclusão Introdução Vetores (revisão) Relacionamento entre vetores e ponteiros 14