Escolar Documentos
Profissional Documentos
Cultura Documentos
A10 Vet Ponteiros PDF
A10 Vet Ponteiros PDF
Ponteiros e vetores
() Elementos de programao em C 1 / 49
Sumrio
1 Ponteiros
2 Vetores
3 Vetores unidimensionais
4 Vetores multidimensionais
5 Iniciao de vetores
6 Ponteiros e vetores
7 Aritmtica de ponteiros
8 () Elementos de programao em C 2 / 49
Ponteiros
Ponteiros
a: 10101
01100001
b: 10101
() Elementos de programao em C 3 / 49
Ponteiros Declarao de ponteiros
Declarao de ponteiros
Declaraes vlidas:
int *ptr_a; Declara ptr_a do tipo ponteiro para int.
int *ptr_a, ptr_b; 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
Declaraes vlidas:
int **ptr_a; Declara ptr_a do tipo ponteiro para ponteiro
para int.
int * const ptr_a; Declara ptr_a do tipo ponteiro (constante) para
int. O contedo de ptr_a no pode ser
modificado, o contedo apontado por ptr_a
pode.
const int * ptr_a; Declara ptr_a do tipo ponteiro para const int.
O contedo de ptr_a pode ser modificado, 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_a;
int **ptr_b; e Ponteiro para Ponteiro para
int ** const ptr_c; int * * ptr_b
so interpretadas do seguinte
modo: Ponteiro para Ponteiro (const) para
() 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:
() Elementos de programao em C 7 / 49
Ponteiros Operador de endereo
Operador de endereo
() Elementos de programao em C 8 / 49
Ponteiros Operador de endereo
Operador de endereo
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 # include < stdio .h >
os endereos armazenados nas int main ( void ) {
variveis ptr_a e ptr_b. 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 Operador de acesso indireto
() Elementos de programao em C 10 / 49
Ponteiros Operador de acesso indireto
Exemplo
Se ptr_a uma varivel do tipo ponteiro para int, ento:
ptr_a resulta no valor armazenado em ptr_a: um
endereo.
() Elementos de programao em C 10 / 49
Ponteiros Operador de acesso indireto
Exemplo
Se ptr_a uma varivel do tipo ponteiro para int, ento:
ptr_a resulta no valor armazenado em ptr_a: um
endereo.
*ptr_a resulta na referncia ao espao de memria
apontado por ptr_a.
() Elementos de programao em C 10 / 49
Ponteiros Operador de acesso indireto
Exemplo
Se ptr_a uma varivel do tipo ponteiro para int, ento:
ptr_a resulta no valor armazenado em ptr_a: um
endereo.
*ptr_a resulta na referncia ao espao de memria
apontado por ptr_a.
*ptr_a = 23; atribui o valor 23 ao espao de memria
apontado por ptr_a.
() Elementos de programao em C 10 / 49
Ponteiros Operador de acesso indireto
Exemplo
Se ptr_a uma varivel do tipo ponteiro para int, ento:
ptr_a resulta no valor armazenado em ptr_a: um
endereo.
*ptr_a resulta na referncia ao espao de memria
apontado por ptr_a.
*ptr_a = 23; atribui o valor 23 ao espao de memria
apontado por ptr_a.
printf("%d", *ptr_a); imprime o contedo do espao de memria
apontado por ptr_a.
() Elementos de programao em C 10 / 49
Ponteiros Operador de acesso indireto
Exemplo
O que impresso pelo # include < stdio .h >
cdigo ao lado? 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 Operador de acesso indireto
Exemplo
O que impresso pelo # include < stdio .h >
cdigo ao lado? 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 Relao entre * e &
&*ptr ptr
*&var_a var_a
&(vet[x]) ((vet) + (x))
() Elementos de programao em C 12 / 49
Ponteiros Ponteiros para funes
() Elementos de programao em C 13 / 49
Ponteiros Ponteiros para funes
() Elementos de programao em C 13 / 49
Ponteiros Ponteiros para funes
() Elementos de programao em C 13 / 49
Vetores
Vetores
() Elementos de programao em C 14 / 49
Vetores Declarao de vetores
Declarao de vetores
() Elementos de programao em C 15 / 49
Vetores Declarao de vetores
Declarao de vetores
() Elementos de programao em C 16 / 49
Vetores Tipo dos vetores
() Elementos de programao em C 17 / 49
Vetores Tipo dos vetores
Exemplo
Qual o tipo dos seguintes vetores?
int alunos[3];
double alunos[2][3];
char *alunos[];
long [*]
() Elementos de programao em C 18 / 49
Vetores Tipo dos vetores
Exemplo
Qual o tipo dos seguintes vetores?
double alunos[2][3];
char *alunos[];
long [*]
() Elementos de programao em C 18 / 49
Vetores Tipo dos vetores
Exemplo
Qual o tipo dos seguintes vetores?
long [*]
() Elementos de programao em C 18 / 49
Vetores Tipo dos vetores
Exemplo
Qual o tipo dos seguintes vetores?
long [*]
() Elementos de programao em C 18 / 49
Vetores Tipo dos vetores
Exemplo
Qual o tipo dos seguintes vetores?
char *alunos[2 + x]; Vetor do tipo char *[2 + x]. Tipo varivel
(porm completo).
long [*]
() Elementos de programao em C 18 / 49
Vetores Tipo dos vetores
Exemplo
Qual o tipo dos seguintes vetores?
char *alunos[2 + x]; Vetor do tipo char *[2 + x]. Tipo varivel
(porm completo).
long [*] Vetor do tipo long [*]. Tipo varivel (de
tamanho no especificado, porm completo).
() Elementos de programao em C 18 / 49
Vetores unidimensionais Atribuio e referncia
Atribuio e referncia
() 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:
() Elementos de programao em C 20 / 49
Vetores unidimensionais Exemplos
Vetores unidimensionais
Exemplo
O programa ao lado l 10 # include < stdio .h >
nmeros inteiros, int main ( void ) {
armazenando-os em um vetor int vetnum [10];
int num ;
de int, e imprime os nmeros for ( int i = 0; i < 10; i ++) {
lidos, aps a leitura. 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
Exemplo
O programa ao lado l uma # include < stdio .h >
quantidade de nmeros int main ( void ) {
inteiros especificada pelo int qtd ;
printf (" Digite a qtd elms : ");
usurio, armazenando-os em scanf ("% d " , & qtd );
um vetor de int, e imprime int vetnum [ qtd ];
for ( int i = 0; i < qtd ; i ++) {
os nmeros lidos, aps a printf (" digite elm % d : " , i );
leitura. scanf ("% d " , & vetnum [ i ]);
}
for ( int i = 0; i < qtd ; i ++) {
printf ("% d " , vetnum [ i ]);
}
return 0;
}
() Elementos de programao em C 22 / 49
Vetores unidimensionais Exemplos
() Elementos de programao em C 23 / 49
Vetores unidimensionais Exemplos
Exemplo
prg_vetA.c prg_vetB.c
# include < stdio .h > # define TAM (10)
extern char estado []; int qtd = TAM ;
extern int qtd ; char estado [ TAM ];
void inicia_vet ( char ); void inicia_vet ( char c ) {
void imp_vet ( char []); for ( int i = 0; i < qtd ; i ++) {
int main ( void ) { estado [ i ] = c ++;
inicia_vet ( a ); }
imp_vet ( estado ); }
return 0;
}
void imp_vet ( char v []) {
for ( int i = 0; i < qtd ; i ++) {
printf ("% c " , v [ i ]);
}
}
() Elementos de programao em C 24 / 49
Vetores multidimensionais
Vetores multidimensionais
a b c
d e f
g h i
j k l
a b c d e f g h i j k 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
() Elementos de programao em C 26 / 49
Vetores multidimensionais Declarao
() Elementos de programao em C 27 / 49
Vetores multidimensionais Declarao
() Elementos de programao em C 28 / 49
Vetores multidimensionais Declarao
() Elementos de programao em C 29 / 49
Vetores multidimensionais Tipo dos vetores multidimensionais
long *vetA[2][3]
Expresso Tipo
vetA long *[2][3]
vetA[1] long *[3]
vetA[1][2] long *
() Elementos de programao em C 30 / 49
Vetores multidimensionais Tipo dos vetores multidimensionais
long *vetA[2][3]
Expresso Tipo
vetA long *[2][3]
vetA[1] long *[3]
vetA[1][2] long *
() Elementos de programao em C 30 / 49
Vetores multidimensionais Exemplos
Vetores multidimensionais
Exemplo
O programa ao lado l # include < stdio .h >
dois nmeros, L e C , int main ( void ) {
ambos maiores que 0, int L , C ;
do {
e depois l, coluna a printf (" Digite a qtd de linhas : ");
coluna, os nmeros scanf ("% d " , & L );
} while ( L <= 0);
correspondentes aos do {
elementos de uma printf (" Digite a qtd de colunas : ");
scanf ("% d " , & C );
matriz de ordem } while ( C <= 0);
L C . Aps a leitura, int mat [ L ][ C ];
a matriz lida printf (" Digite , coluna a coluna , ");
printf (" os elementos de uma ");
impressa. printf (" matriz % d x % d \ n " , L , C );
Continua...
() 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 void imp_vet ( int L , int C , int m [ L ][ C ]) {
recebe dois inteiros L for ( int i = 0; i < L ; i ++) {
e C e uma matriz de for ( int j = 0; j < C ; j ++) {
printf ("% d " , m [ i ][ j ]);
L linhas e C colunas, }
e imprime a matriz printf ("\ n ");
}
recebida. }
() 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.
2 Se o valor corrente tambm uma lista, a atribuio de valor ao
elemento corrente e a seus subelementos (se ele for um vetor) fica
restrita aos valores da lista que corresponde ao valor corrente.
3 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", "-"}};
Iniciao de vetores
Exemplo
char *fatorRH[8][2] = {"A", "+", "A", {"B", "+"}, {"B"}, {"O", "+"},
"O", "+", "AB", "-"};
1 fatorRH[0] e "A"
fatorRH[0][0] "A"
fatorRH[0][1] "+"
2 fatorRH[1] e "A"
fatorRH[1][0] "A"
fatorRH[1][1] {"B", "+"} ; fatorRH[1][1] "B"
3 fatorRH[2] e {"B"}
fatorRH[2][0] "B"
fatorRH[2][1] NULL
4 fatorRH[3] e {"O", "+"}
5
() Elementos de programao em C 36 / 49
Iniciao de vetores Iniciao seletiva
Iniciao seletiva
Exemplo
char *fatorRH[8][2] = {{"A", "+"}, [5]={"O", "-"}, {"AB", "+"},
[1]={"A", "-"}, {[1]= "+"}};
Cadeias de caracteres
Cada caractere da cadeia,
char vogais [] = " aeiou ";
incluindo o caractere nulo ao char let_ini [5] = " abcde ";
final, inicia um elemento do char let_meio [5] = " klmnop ";
char let_fim [5] = " xyz ";
vetor.
() Elementos de programao em C 38 / 49
Iniciao de vetores Cadeias de caracteres e literais compostos
Cadeias de caracteres
Cada caractere da cadeia,
char vogais [] = " aeiou ";
incluindo o caractere nulo ao char let_ini [5] = " abcde ";
final, inicia um elemento do char let_meio [5] = " klmnop ";
char let_fim [5] = " xyz ";
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};
() Elementos de programao em C 38 / 49
Ponteiros e vetores
Ponteiros e vetores
Na avaliao de expresses:
Toda expresso do tipo vetor de hT i convertida em uma expresso
do tipo ponteiro para hT i, 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.
() Elementos de programao em C 39 / 49
Ponteiros e vetores
Ponteiros e vetores
Exemplo
Considerando vet declarado como char vet[3][2][4], ento
() Elementos de programao em C 40 / 49
Aritmtica de ponteiros
Aritmtica de ponteiros
Para uma varivel ptrA do tipo ponteiro para hT i e um valor inteiro qtd:
1 A operao ptrA + qtd ou qtd + ptrA resulta no endereo que se
obtm somando qtd (tamanho de hT i) a ptrA. Esse resultado do
tipo ponteiro para hT i.
() Elementos de programao em C 41 / 49
Aritmtica de ponteiros
Aritmtica de ponteiros
() Elementos de programao em C 42 / 49
Aritmtica de ponteiros Referenciando elementos dos vetores
() Elementos de programao em C 43 / 49
Aritmtica de ponteiros Referenciando elementos dos vetores
() Elementos de programao em C 43 / 49
Aritmtica de ponteiros Referenciando elementos dos vetores
() Elementos de programao em C 43 / 49
Aritmtica de ponteiros Referenciando elementos dos vetores
Exemplo
O programa ao lado l e # include < stdio .h >
imprime, na ordem inversa int main ( void ) {
que foram digitados, um int N ;
do {
vetor de N nmeros. 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 Referenciando elementos dos vetores
Ponteiros e ndices
void imp_vet ( int L , int C , int m [ L ][ C ]) {
for ( int i = 0; i < L ; i ++) {
for ( int j = 0; j < C ; j ++) {
printf ("% d " , (*( m + i ))[ j ]);
}
printf ("\ n ");
}
}
() Elementos de programao em C 45 / 49
Definindo tipos vetores
() Elementos de programao em C 46 / 49
Qualificando as variveis do tipo vetor
() Elementos de programao em C 47 / 49
Qualificando as variveis do tipo vetor
Observao
A qualificao de variveis do tipo vetor s pode ocorrer em prottipos e
declarao de parmetros.
() Elementos de programao em C 47 / 49
Compatibilidade de vetores e ponteiros
() Elementos de programao em C 48 / 49
Compatibilidade de vetores e ponteiros
() Elementos de programao em C 48 / 49
Bibliografia
Bibliografia
ISO/IEC
C Programming Language Standard
ISO/IEC 9899:2011, International Organization for Standardization;
International Electrotechnical Commission, 3rd edition, WG14/N1570
Committee final 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