Professional Documents
Culture Documents
Ponteiros e vetores
Francisco A. C. Pinheiro, Elementos de Programao em C, Bookman, 2012. Visite os stios do livro para obter material adicional: www.bookman.com.br e www.facp.pro.br/livroc () Elementos de programao em C 1 / 49
Sumrio
1
Ponteiros Vetores Vetores unidimensionais Vetores multidimensionais Iniciao de vetores Ponteiros e vetores Aritmtica de ponteiros
() Elementos de programao em C 2 / 49
Ponteiros
Ponteiros
As variveis do tipo ponteiro para T armazenam endereos de memria.
Ponteiro para int a: b: 10101 01100001 10101
Os valores armazenados nesses endereos so interpretados como valores do tipo T (quando acessados por meio da varivel ponteiro para T que designa o endereo).
()
Elementos de programao em C
3 / 49
Ponteiros
Declarao de ponteiros
Declarao de ponteiros
DeclPonteiro ::= * [ QualifTipo ] | * [ QualifTipo ] DeclPonteiro Declaraes vlidas: int *ptr_a; int *ptr_a, ptr_b;
Declara ptr_a do tipo ponteiro para int. Declara as variveis ptr_a, do tipo ponteiro para int, e ptr_b, do tipo int.
()
Elementos de programao em C
4 / 49
Ponteiros
Declarao de ponteiros
Declarao de ponteiros
Declara ptr_a do tipo ponteiro para ponteiro para int. Declara ptr_a do tipo ponteiro (constante) para int. O contedo de ptr_a no pode ser modicado, o contedo apontado por ptr_a pode. Declara ptr_a do tipo ponteiro para const int. O contedo de ptr_a pode ser modicado, o contedo apontado por ptr_a no pode.
()
Elementos de programao em C
5 / 49
Ponteiros
Declarao de ponteiros
Declarao de ponteiros
Exemplo
Ponteiro para
As declaraes int *ptr_a; int **ptr_b; e int ** const ptr_c; so interpretadas do seguinte modo:
int
()
Elementos de programao em C
6 / 49
Ponteiros
Declarao de ponteiros
Declarao de ponteiros
Exemplo As declaraes int *ptr_a; int **ptr_b; e int ** const ptr_c; so interpretadas do seguinte modo:
int *ptr_a ptr_a: 0xFF Endereo de int **ptr_b ptr_b: 0x1A 0xA3 Endereo de Endereo de int ** const ptr_c ptr_c: 0xB7 0xC6 Endereo de Endereo de
()
Elementos de programao em C
7 / 49
Ponteiros
Operador de endereo
Operador de endereo
O operador &, aplicado a uma expresso que designa uma localizao de memria, resulta no endereo da localizao designada pela expresso.
()
Elementos de programao em C
8 / 49
Ponteiros
Operador de endereo
Operador de endereo
O operador &, aplicado a uma expresso que designa uma localizao de memria, resulta no endereo da localizao designada pela expresso. Exemplo &aluno resulta no endereo da varivel aluno &(notas[i]) resulta no endereo designado pela expresso (notas[i]).
()
Elementos de programao em C
8 / 49
Ponteiros
Operador de endereo
Operador de endereo
Exemplo O programa ao lado imprime os endereos armazenados nas variveis ptr_a e ptr_b.
# include < stdio .h > int main ( void ) { int x = 97; int * ptr_a ; char * ptr_b ; ptr_a = & x ; ptr_b = & x ; printf ("% p % p \ n " , ( void *) ptr_a , ( void *) ptr_b ); return 0; }
()
Elementos de programao em C
9 / 49
Ponteiros
()
Elementos de programao em C
10 / 49
Ponteiros
()
Elementos de programao em C
10 / 49
Ponteiros
()
Elementos de programao em C
10 / 49
Ponteiros
()
Elementos de programao em C
10 / 49
Ponteiros
Ponteiros
# include < stdio .h > int main ( void ) { int x = 97; int y = 76; int * ptr_x = & x ; int * ptr_y = & y ; printf ("% d % d \ n " , * ptr_x , * ptr_y ); * ptr_x = 123 + * ptr_y ; (* ptr_y )++; printf ("% d % d \ n " , x , y ); return 0; }
()
Elementos de programao em C
11 / 49
Ponteiros
# include < stdio .h > int main ( void ) { int x = 97; int y = 76; int * ptr_x = & x ; int * ptr_y = & y ; printf ("% d % d \ n " , * ptr_x , * ptr_y ); * ptr_x = 123 + * ptr_y ; (* ptr_y )++; printf ("% d % d \ n " , x , y ); return 0; }
Resposta: 97 76 199 77
() Elementos de programao em C 11 / 49
Ponteiros
As seguintes equivalncias so vlidas: &*ptr ptr *&var_a var_a &(vet[x]) ((vet) + (x))
()
Elementos de programao em C
12 / 49
Ponteiros
()
Elementos de programao em C
13 / 49
Ponteiros
()
Elementos de programao em C
13 / 49
Ponteiros
()
Elementos de programao em C
13 / 49
Vetores
Vetores
Sequncias de elementos de um dado tipo, armazenados em posies contguas da memria, distribudos em um nmero predeterminado de dimenses.
()
Elementos de programao em C
14 / 49
Vetores
Declarao de vetores
Declarao de vetores
DeclDim { DeclDim }
[ ListaQualifTipo ] [ QtdElmDim ] ] static [ ListaQualifTipo ] QtdElmDim ] ListaQualifTipo static QtdElmDim ] [ ListaQualifTipo ] * ] QualifTipo
()
Elementos de programao em C
15 / 49
Vetores
Declarao de vetores
Declarao de vetores
Vetor de int, de uma dimenso, com 3 elementos. Vetor bidimensional de double, com 2 elementos na primeira dimenso e 3 na segunda. De fato, vetor de uma dimenso com 2 elementos do tipo vetor de uma dimenso.
()
Elementos de programao em C
16 / 49
Vetores
Quando os elementos de um vetor so de um tipo T , diz-se que a varivel que o declara um vetor de T . O tipo do vetor T []. . .[] (incluindo a especicao de cada dimenso). Os vetores de T podem ter seu tipo: Completo. Quando a quantidade de elementos denida. Incompleto. Quando a quantidade de elementos no denida (a expresso da quantidade omitida). Varivel. Quando a quantidade de elementos no constante. Varivel (com quantidade no especicada). A quantidade caracterizada por um asterisco.
()
Elementos de programao em C
17 / 49
Vetores
()
Elementos de programao em C
18 / 49
Vetores
()
Elementos de programao em C
18 / 49
Vetores
()
Elementos de programao em C
18 / 49
Vetores
()
Elementos de programao em C
18 / 49
Vetores
()
Elementos de programao em C
18 / 49
Vetores
()
Elementos de programao em C
18 / 49
Vetores unidimensionais
Atribuio e referncia
Atribuio e referncia
Os elementos de um vetor so modicados apenas individualmente, em atribuies da forma vetA[indice] = 23. A referncia a um elemento feita indicando-se o ndice do elemento, entre os colchetes, aps o nome do vetor:
o primeiro elemento possui ndice 0, o segundo, ndice 1, o vigsimo, ndice 19, etc.
Os elementos de um vetor, desde que completamente determinados, podem participar de qualquer operao compatvel com o seu tipo.
()
Elementos de programao em C
19 / 49
Vetores unidimensionais
Atribuio e referncia
Atribuio e referncia
Exemplo Considerando a declarao int vet[150]; e considerando que a varivel x tenha o valor 17, ento: vet[3] = 23; vet[2 * x + 1] = 3.56; Atribui o valor 23 ao quarto elemento de vet. Atribui o valor 3 (converso do valor 3, 56 do tipo double em um valor do tipo int) ao trigsimo sexto elemento de vet. Adiciona 1 ao valor de vet[3], isto , ao quarto elemento de vet. Subtrai 1 do valor de vet[3]. Compara o valor de vet[3] com o inteiro 2.
Elementos de programao em C 20 / 49
Vetores unidimensionais
Exemplos
Vetores unidimensionais
Exemplo O programa ao lado l 10 nmeros inteiros, armazenando-os em um vetor de int, e imprime os nmeros lidos, aps a leitura.
# include < stdio .h > int main ( void ) { int vetnum [10]; int num ; for ( int i = 0; i < 10; i ++) { printf (" digite elm % d : " , i ); scanf ("% d " , & num ); vetnum [ i ] = num ; } for ( int i = 0; i < 10; i ++) { printf ("% d " , vetnum [ i ]); } return 0; }
()
Elementos de programao em C
21 / 49
Vetores unidimensionais
Exemplos
()
Elementos de programao em C
22 / 49
Vetores unidimensionais
Exemplos
()
Elementos de programao em C
Vetores unidimensionais
Exemplos
prg_vetB.c
# define TAM (10) int qtd = TAM ; char estado [ TAM ]; void inicia_vet ( char c ) { for ( int i = 0; i < qtd ; i ++) { estado [ i ] = c ++; } }
()
Elementos de programao em C
24 / 49
Vetores multidimensionais
Vetores multidimensionais
Os vetores multidimensionais so implementados em C como vetores de vetores, isto , vetores cujos elementos so vetores. O vetor bidimensional que corresponde matriz a d g j implementado da seguinte forma: a b c d e f g h i j k l b e h k c f i l
()
Elementos de programao em C
25 / 49
Vetores multidimensionais
Vetores multidimensionais
A referncia aos elementos dos vetores multidimensionais pode ser parcial, com a obteno de um vetor componente, ou total, com a obteno de um elemento.
()
Elementos de programao em C
26 / 49
Vetores multidimensionais
Vetores multidimensionais
A referncia aos elementos dos vetores multidimensionais pode ser parcial, com a obteno de um vetor componente, ou total, com a obteno de um elemento. Exemplo Para uma matriz (vetor bidimensional) A: a b c d e f g h i j k l
A[0][2] = c
()
A[2][1] = h
Elementos de programao em C
A[3][0] = j
26 / 49
Vetores multidimensionais
Declarao
int alunos[3][2];
Vetor de int[2] (vetor bidimensional de int). Tipo completo. Vetor de char *[2][4] (vetor tridimensional de char *). Tipo incompleto.
char *alunos[][2][4];
()
Elementos de programao em C
27 / 49
Vetores multidimensionais
Declarao
long [][x];
Vetor de long[x] (vetor bidimensional de long). Tipo incompleto. Vetor de long[*] (vetor bidimensional de long). Tipo incompleto.
long [][*]
()
Elementos de programao em C
28 / 49
Vetores multidimensionais
Declarao
Vetor de char *[2 + x] (vetor bidimensional de char *). Tipo varivel (porm, completo). Vetor de short int[2 + x] (vetor bidimensional de short int). Tipo varivel (porm, completo).
()
Elementos de programao em C
29 / 49
Vetores multidimensionais
()
Elementos de programao em C
30 / 49
Vetores multidimensionais
()
Elementos de programao em C
30 / 49
Vetores multidimensionais
Exemplos
Vetores multidimensionais
Exemplo O programa ao lado l dois nmeros, L e C , ambos maiores que 0, e depois l, coluna a coluna, os nmeros correspondentes aos elementos de uma matriz de ordem L C . Aps a leitura, a matriz lida impressa. Continua...
# include < stdio .h > int main ( void ) { int L , C ; do { printf (" Digite a qtd de linhas : "); scanf ("% d " , & L ); } while ( L <= 0); do { printf (" Digite a qtd de colunas : "); scanf ("% d " , & C ); } while ( C <= 0); int mat [ L ][ C ]; printf (" Digite , coluna a coluna , "); printf (" os elementos de uma "); printf (" matriz % d x % d \ n " , L , C );
()
Elementos de programao em C
31 / 49
Vetores multidimensionais
Exemplos
Vetores multidimensionais
Exemplo Continuao.
for ( int j = 0; j < C ; j ++) { for ( int i = 0; i < L ; i ++) { printf (" elm (% d ,% d ):" , ( i +1) , ( j +1)); scanf ("% d " , & mat [ i ][ j ]); } } for ( int i = 0; i < L ; i ++) { for ( int j = 0; j < C ; j ++) { printf ("% d " , mat [ i ][ j ]); } printf ("\ n "); } return 0; }
()
Elementos de programao em C
32 / 49
Vetores multidimensionais
Exemplos
Vetores multidimensionais
Exemplo A funo ao lado recebe dois inteiros L e C e uma matriz de L linhas e C colunas, e imprime a matriz recebida.
void imp_vet ( int L , for ( int i = 0; i for ( int j = 0; printf ("% d " , } printf ("\ n "); } }
()
Elementos de programao em C
33 / 49
Iniciao de vetores
Iniciao de vetores
Os elementos do vetor so associados aos valores da lista de iniciao, segundo o seguinte processo:
1
Se o valor corrente pode ser atribudo ao elemento corrente, a atribuio realizada e o processo prossegue com o prximo elemento do vetor e o prximo valor da lista, que sero os novos elemento e valor correntes. Se o valor corrente tambm uma lista, a atribuio de valor ao elemento corrente e a seus subelementos (se ele for um vetor) ca restrita aos valores da lista que corresponde ao valor corrente. Se o elemento corrente tambm um vetor, o processo prossegue recursivamente, associando o primeiro elemento desse vetor ao valor corrente, at que a atribuio seja realizada. Os elementos no iniciados de um vetor assumem o valor padro que corresponde ao seu tipo. Os valores excedentes da lista de iniciao so ignorados.
() Elementos de programao em C 34 / 49
Iniciao de vetores
Iniciao de vetores
Exemplo
char *fatorRH[8][2] = {{"A", "+"}, {"A", "-"}, {"B", "+"}, {"B", "-"}, {"O", "+"}, {"AB", "-"}, {"O", "-"}};
4 5
Iniciao de vetores
Iniciao de vetores
Exemplo
char *fatorRH[8][2] = {"A", "+", "A", {"B", "+"}, {"B"}, {"O", "+"}, "O", "+", "AB", "-"};
4 5
Iniciao de vetores
Iniciao seletiva
Iniciao seletiva
Exemplo
char *fatorRH[8][2] = {{"A", "+"}, [5]={"O", "-"}, {"AB", "+"}, [1]={"A", "-"}, {[1]= "+"}};
4 5
Iniciao de vetores
Cadeias de caracteres Cada caractere da cadeia, incluindo o caractere nulo ao nal, inicia um elemento do vetor.
char char char char vogais [] = " aeiou "; let_ini [5] = " abcde "; let_meio [5] = " klmnop "; let_fim [5] = " xyz ";
()
Elementos de programao em C
38 / 49
Iniciao de vetores
Cadeias de caracteres Cada caractere da cadeia, incluindo o caractere nulo ao nal, inicia um elemento do vetor. Literais compostos Os literais compostos podem iniciar vetores declarados como ponteiros.
int * primos = ( int []){2 , 3 , 5 , 7}; int * perfeitos = ( int [4]){6 , 28 , 496 , 8128}; char char char char vogais [] = " aeiou "; let_ini [5] = " abcde "; let_meio [5] = " klmnop "; let_fim [5] = " xyz ";
()
Elementos de programao em C
38 / 49
Ponteiros e vetores
Ponteiros e vetores
Na avaliao de expresses: Toda expresso do tipo vetor de T convertida em uma expresso do tipo ponteiro para T , cujo valor um ponteiro apontando para o primeiro elemento do vetor. Excees: operandos dos operadores sizeof e &, e os literais cadeia de caracteres usados em expresses de iniciao. As declaraes de parmetros de funo do tipo vetor de T so ajustadas para declaraes de parmetros do tipo ponteiro (possivelmente qualicado) para T .
()
Elementos de programao em C
39 / 49
Ponteiros e vetores
Ponteiros e vetores
()
Elementos de programao em C
40 / 49
Aritmtica de ponteiros
Aritmtica de ponteiros
Para uma varivel ptrA do tipo ponteiro para T e um valor inteiro qtd:
1
A operao ptrA + qtd ou qtd + ptrA resulta no endereo que se obtm somando qtd (tamanho de T ) a ptrA. Esse resultado do tipo ponteiro para T . A operao ptrA - qtd resulta no endereo que se obtm subtraindo qtd (tamanho de T ) de ptrA. Esse resultado do tipo ponteiro para T .
A operao qtd - ptrA no denida.
()
Elementos de programao em C
41 / 49
Aritmtica de ponteiros
Aritmtica de ponteiros
A operao ptrA - ptrB resulta no valor inteiro que corresponde distncia (orientada) entre os endereos ptrA e ptrB medida em termos do tamanho de T : (endereo ptrA - endereo ptrB)/(tamanho de T ). Essa distncia pode ser negativa e o valor obtido do tipo ptrdiff_t.
Equivale subtrao dos ndices que os ponteiros representam. Denida para ponteiros que apontam para o mesmo tipo T .
()
Elementos de programao em C
42 / 49
Aritmtica de ponteiros
()
Elementos de programao em C
43 / 49
Aritmtica de ponteiros
()
Elementos de programao em C
43 / 49
Aritmtica de ponteiros
()
Elementos de programao em C
43 / 49
Aritmtica de ponteiros
# include < stdio .h > int main ( void ) { int N ; do { scanf ("% d " , & N ); } while (( N <= 0) || ( N > 1000)); int lval [ N ]; for ( int i = 0; i < N ; i ++) { scanf ("% d " , ( lval + i )); } for ( int i = N - 1; i >= 0; i - -) { if ((*( lval + i ) % 2) == 0) { printf ("% d " , *( lval + i )); } } return 0; }
()
Elementos de programao em C
44 / 49
Aritmtica de ponteiros
Ponteiros e ndices
void imp_vet ( int L , for ( int i = 0; i for ( int j = 0; printf ("% d " , } printf ("\ n "); } }
()
Elementos de programao em C
45 / 49
Na denio de tipos vetores com typedef usa-se a declarao do novo tipo como se fosse uma varivel do tipo vetor que se desejar substituir: typedef int vA_t[10] typedef char vB_t[3][6] typedef float vC_t[][34] Declara o tipo vA_t como sinnimo de int [10]. Declara o tipo vB_t como sinnimo de char [3][6]. Declara o tipo vC_t como sinnimo de float [][34].
()
Elementos de programao em C
46 / 49
A varivel vet declarada como um vetor de int const. A varivel vet constante, declarada como um vetor de int. A varivel vet um vetor de int, com (a expectativa de) pelo menos 23 elementos.
()
Elementos de programao em C
47 / 49
A varivel vet declarada como um vetor de int const. A varivel vet constante, declarada como um vetor de int. A varivel vet um vetor de int, com (a expectativa de) pelo menos 23 elementos.
Observao A qualicao de variveis do tipo vetor s pode ocorrer em prottipos e declarao de parmetros.
()
Elementos de programao em C
47 / 49
Dois vetores so compatveis se o tipo dos seus elementos so compatveis, possuem as mesmas dimenses e os especicadores de tamanho, se existirem e forem constantes, tm o mesmo valor.
()
Elementos de programao em C
48 / 49
Dois vetores so compatveis se o tipo dos seus elementos so compatveis, possuem as mesmas dimenses e os especicadores de tamanho, se existirem e forem constantes, tm o mesmo valor.
Dois ponteiros so compatveis se possuem os mesmos qualicadores e apontam para tipos compatveis.
()
Elementos de programao em C
48 / 49
Bibliograa
Bibliograa
ISO/IEC C Programming Language Standard ISO/IEC 9899:2011, International Organization for Standardization; International Electrotechnical Commission, 3rd edition, WG14/N1570 Committee nal draft, abril de 2011. Francisco A. C. Pinheiro Elementos de programao em C Bookman, Porto Alegre, 2012. www.bookman.com.br, www.facp.pro.br/livroc
()
Elementos de programao em C
49 / 49