You are on page 1of 69

Elementos de programao em C

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

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

As variveis do tipo ponteiro para hT i armazenam endereos de


memria.
Ponteiro para int

a: 10101
01100001
b: 10101

Ponteiro para char

Os valores armazenados nesses endereos so interpretados como


valores do tipo hT i (quando acessados por meio da varivel ponteiro
para hT i que designa o endereo).

() Elementos de programao em C 3 / 49
Ponteiros Declarao de ponteiros

Declarao de ponteiros

hDeclPonteiroi ::= * [ hQualifTipoi ]


| * [ hQualifTipoi ] hDeclPonteiroi

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

int * * const ptr_c

() 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 int **ptr_b int ** const ptr_c

ptr_a: 0xFF Endereo de ptr_b: 0x1A Endereo de ptr_c: 0xB7 Endereo de

0110 Contedo corresponde 0xA3 0xC6


Endereo de Endereo de
a um inteiro
0101 Contedo corresponde 1011 Contedo corresponde
a um inteiro a um inteiro

() 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 # 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

Operador de acesso indireto


O operador *, quando aplicado a uma varivel do tipo ponteiro, resulta na
referncia ao endereo apontado pelo ponteiro, que pode ser usada:
para obter o contedo referido ou
como o operando esquerdo do operador de atribuio

() Elementos de programao em C 10 / 49
Ponteiros Operador de acesso indireto

Operador de acesso indireto


O operador *, quando aplicado a uma varivel do tipo ponteiro, resulta na
referncia ao endereo apontado pelo ponteiro, que pode ser usada:
para obter o contedo referido ou
como o operando esquerdo do operador de atribuio

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

Operador de acesso indireto


O operador *, quando aplicado a uma varivel do tipo ponteiro, resulta na
referncia ao endereo apontado pelo ponteiro, que pode ser usada:
para obter o contedo referido ou
como o operando esquerdo do operador de atribuio

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

Operador de acesso indireto


O operador *, quando aplicado a uma varivel do tipo ponteiro, resulta na
referncia ao endereo apontado pelo ponteiro, que pode ser usada:
para obter o contedo referido ou
como o operando esquerdo do operador de atribuio

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

Operador de acesso indireto


O operador *, quando aplicado a uma varivel do tipo ponteiro, resulta na
referncia ao endereo apontado pelo ponteiro, que pode ser usada:
para obter o contedo referido ou
como o operando esquerdo do operador de atribuio

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

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

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 &

Relao entre * e &

As seguintes equivalncias so vlidas:

&*ptr ptr
*&var_a var_a
&(vet[x]) ((vet) + (x))

() Elementos de programao em C 12 / 49
Ponteiros Ponteiros para funes

Ponteiros para funes

Na declarao de ponteiros para funes deve ser observado que o operador


() tem maior precedncia que o declarador de ponteiro *:

() Elementos de programao em C 13 / 49
Ponteiros Ponteiros para funes

Ponteiros para funes

Na declarao de ponteiros para funes deve ser observado que o operador


() tem maior precedncia que o declarador de ponteiro *:

void *fun(void); Declara fun como uma funo sem argumentos


retornando um ponteiro para void.
void (*fun)(void); Declara fun como um ponteiro para uma funo
sem argumentos retornando void.

() Elementos de programao em C 13 / 49
Ponteiros Ponteiros para funes

Ponteiros para funes

Na declarao de ponteiros para funes deve ser observado que o operador


() tem maior precedncia que o declarador de ponteiro *:

void *fun(void); Declara fun como uma funo sem argumentos


retornando um ponteiro para void.
void (*fun)(void); Declara fun como um ponteiro para uma funo
sem argumentos retornando void.
int *fun(int); Declara fun como uma funo de int
retornando um ponteiro para int.
int (*fun)(int); Declara fun como um ponteiro para uma funo
de int retornando int.

() 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

hDeclaradorVetor i ::= hIdentificador i hDeclDimi { hDeclDimi }

hDeclDimi ::= [ [ hListaQualifTipoi ] [ hQtdElmDimi ] ]


| [ static [ hListaQualifTipoi ] hQtdElmDimi ]
| [ hListaQualifTipoi static hQtdElmDimi ]
| [ [ hListaQualifTipoi ] * ]

hListaQualifTipoi ::= hQualifTipoi | hListaQualifTipoi hQualifTipoi

hQtdElmDimi ::= Expresso do tipo inteiro definindo o tamanho da


dimenso do vetor.

() Elementos de programao em C 15 / 49
Vetores Declarao de vetores

Declarao de vetores

int alunos[3]; Vetor de int, de uma dimenso, com 3


elementos.
double alunos[2][3]; 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 Tipo dos vetores

Tipo dos vetores

Quando os elementos de um vetor so de um tipo hT i, diz-se que a


varivel que o declara um vetor de hT i.
O tipo do vetor hT i[]. . .[] (incluindo a especificao de cada
dimenso).
Os vetores de hT i podem ter seu tipo:
Completo. Quando a quantidade de elementos definida.
Incompleto. Quando a quantidade de elementos no definida (a
expresso da quantidade omitida).
Varivel. Quando a quantidade de elementos no constante.
Varivel (com quantidade no especificada). A quantidade
caracterizada por um asterisco.

() Elementos de programao em C 17 / 49
Vetores Tipo dos vetores

Tipo dos vetores

Exemplo
Qual o tipo dos seguintes vetores?

int alunos[3];

double alunos[2][3];

char *alunos[];

char *alunos[2 + x];

long [*]

() Elementos de programao em C 18 / 49
Vetores Tipo dos vetores

Tipo dos vetores

Exemplo
Qual o tipo dos seguintes vetores?

int alunos[3]; Vetor do tipo int[3]. Tipo completo.

double alunos[2][3];

char *alunos[];

char *alunos[2 + x];

long [*]

() Elementos de programao em C 18 / 49
Vetores Tipo dos vetores

Tipo dos vetores

Exemplo
Qual o tipo dos seguintes vetores?

int alunos[3]; Vetor do tipo int[3]. Tipo completo.

double alunos[2][3]; Vetor do tipo double[2][3]. Tipo


completo.
char *alunos[];

char *alunos[2 + x];

long [*]

() Elementos de programao em C 18 / 49
Vetores Tipo dos vetores

Tipo dos vetores

Exemplo
Qual o tipo dos seguintes vetores?

int alunos[3]; Vetor do tipo int[3]. Tipo completo.

double alunos[2][3]; Vetor do tipo double[2][3]. Tipo


completo.
char *alunos[]; Vetor do tipo char *[]. Tipo incompleto.

char *alunos[2 + x];

long [*]

() Elementos de programao em C 18 / 49
Vetores Tipo dos vetores

Tipo dos vetores

Exemplo
Qual o tipo dos seguintes vetores?

int alunos[3]; Vetor do tipo int[3]. Tipo completo.

double alunos[2][3]; Vetor do tipo double[2][3]. Tipo


completo.
char *alunos[]; Vetor do tipo char *[]. Tipo incompleto.

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

Tipo dos vetores

Exemplo
Qual o tipo dos seguintes vetores?

int alunos[3]; Vetor do tipo int[3]. Tipo completo.

double alunos[2][3]; Vetor do tipo double[2][3]. Tipo


completo.
char *alunos[]; Vetor do tipo char *[]. Tipo incompleto.

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

Os elementos de um vetor so modificados 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; Atribui o valor 23 ao quarto elemento de vet.


vet[2 * x + 1] = 3.56; Atribui o valor 3 (converso do valor 3, 56 do
tipo double em um valor do tipo int) ao
trigsimo sexto elemento de vet.
vet[3]++; Adiciona 1 ao valor de vet[3], isto , ao
quarto elemento de vet.
--vet[3]; Subtrai 1 do valor de vet[3].
(vet[3] > 2) 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 # 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

Vetores unidimensionais tamanho varivel

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

Vetores unidimensionais tamanho varivel


Exemplo
O programa ao lado l uma # include < stdio .h >
quantidade de nmeros void imp_vet ( int , int [*]);
inteiros especificada pelo int main ( void ) {
int qtd ;
usurio, armazenando-os em printf (" Digite a qtd elms : ");
um vetor de int. scanf ("% d " , & qtd );
int vetnum [ qtd ];
Aps a leitura a funo for ( int i = 0; i < qtd ; i ++) {
imp_vet chamada para printf (" digite elm % d : " , i );
scanf ("% d " , & vetnum [ i ]);
imprimir o vetor lido. }
imp_vet ( qtd , vetnum );
return 0;
}
void imp_vet ( int x , int vet [ x ]) {
for ( int i = 0; i < x ; i ++) {
printf ("% d " , vet [ i ]);
}
}

() Elementos de programao em C 23 / 49
Vetores unidimensionais Exemplos

Vetores unidimensionais incompletos

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

Os vetores multidimensionais so implementados em C como vetores de


vetores, isto , vetores cujos elementos so vetores.
O vetor bidimensional que corresponde matriz

a b c
d e f
g h i
j k l

implementado da seguinte forma:

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

As seguintes referncias so vlidas:

A[0] = a b c A[2] = g h i A[3] = j k l

A[0][2] = c A[2][1] = h A[3][0] = j

() Elementos de programao em C 26 / 49
Vetores multidimensionais Declarao

Vetores multidimensionais declarao

int alunos[3][2]; Vetor de int[2]


(vetor bidimensional de int).
Tipo completo.
char *alunos[][2][4]; Vetor de char *[2][4]
(vetor tridimensional de char *).
Tipo incompleto.

() Elementos de programao em C 27 / 49
Vetores multidimensionais Declarao

Vetores multidimensionais declarao

long [][x]; Vetor de long[x]


(vetor bidimensional de long).
Tipo incompleto.
long [][*] Vetor de long[*]
(vetor bidimensional de long).
Tipo incompleto.

() Elementos de programao em C 28 / 49
Vetores multidimensionais Declarao

Vetores multidimensionais declarao

char *alunos[y][2 + x]; Vetor de char *[2 + x]


(vetor bidimensional de char *).
Tipo varivel (porm, completo).
short int alunos[3][2 + x]; Vetor de short int[2 + x]
(vetor bidimensional de short int).
Tipo varivel (porm, completo).

() Elementos de programao em C 29 / 49
Vetores multidimensionais Tipo dos vetores multidimensionais

Vetores multidimensionais tipo

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

Vetores multidimensionais tipo

long *vetA[2][3]
Expresso Tipo
vetA long *[2][3]
vetA[1] long *[3]
vetA[1][2] long *

const char vetB[2][3][x]


Expresso Tipo
vetB const char[2][3][x]
vetB[1] const char[3][x]
vetB[1][2] const char[x]
vetB[1][0][1] const char

() 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", "-"}};

1 fatorRH[0] e {"A", "+"}


fatorRH[0][0] "A"
fatorRH[0][1] "+"
2 fatorRH[1] e {"A", "-"}
fatorRH[1][0] "A"
fatorRH[1][1] "-"
3 fatorRH[2] e {"B", "+"}
fatorRH[2][0] "B"
fatorRH[2][1] "+"
4 fatorRH[3] e {"B", "-"}
5
() Elementos de programao em C 35 / 49
Iniciao de vetores

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]= "+"}};

1 fatorRH[0] e {"A", "+"}


fatorRH[0][0] "A"
fatorRH[0][1] "+"
2 fatorRH[5] e {"A", "-"}
fatorRH[5][0] "O"
fatorRH[5][1] "-"
3 fatorRH[6] e {"AB", "+"}
fatorRH[6][0] "AB"
fatorRH[6][1] "+"
4 fatorRH[1] e {"A", "-"}
5
() Elementos de programao em C 37 / 49
Iniciao de vetores Cadeias de caracteres e literais compostos

Iniciao com 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.

() Elementos de programao em C 38 / 49
Iniciao de vetores Cadeias de caracteres e literais compostos

Iniciao com 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.

As declaraes de parmetros de funo do tipo vetor de hT i so


ajustadas para declaraes de parmetros do tipo ponteiro
(possivelmente qualificado) para hT i.

() Elementos de programao em C 39 / 49
Ponteiros e vetores

Ponteiros e vetores

Exemplo
Considerando vet declarado como char vet[3][2][4], ento

Expresso Tipo Convertido em


vet char[3][2][4] char (*)[2][4].
vet[x] char[2][4] char (*)[4].
vet[1][0] char[4] char *.
vet[x][y][w] char Sem converso a ponteiro.

() 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.

2 A operao ptrA - qtd resulta no endereo que se obtm subtraindo


qtd (tamanho de hT i) de ptrA. Esse resultado do tipo ponteiro
para hT i.
A operao qtd - ptrA no definida.

() Elementos de programao em C 41 / 49
Aritmtica de ponteiros

Aritmtica de ponteiros

Para variveis ptrA e ptrB do tipo ponteiro para hT i:


3 A operao ptrA - ptrB resulta no valor inteiro que corresponde
distncia (orientada) entre os endereos ptrA e ptrB medida em
termos do tamanho de hT i: (endereo ptrA - endereo
ptrB)/(tamanho de hT i). Essa distncia pode ser negativa e o valor
obtido do tipo ptrdiff_t.
Equivale subtrao dos ndices que os ponteiros representam.
Definida para ponteiros que apontam para o mesmo tipo hT i.

4 A operao ptrA + ptrB no permitida.

() Elementos de programao em C 42 / 49
Aritmtica de ponteiros Referenciando elementos dos vetores

Referenciando elementos dos vetores com ponteiros

Para um vetor unidimensional vet, a referncia


vet[i] corresponde a *(vet + i).

() Elementos de programao em C 43 / 49
Aritmtica de ponteiros Referenciando elementos dos vetores

Referenciando elementos dos vetores com ponteiros

Para um vetor unidimensional vet, a referncia


vet[i] corresponde a *(vet + i).
Para um vetor bidimensional vet, a referncia
vet[i][j] corresponde a *(*(vet + i) + j).

() Elementos de programao em C 43 / 49
Aritmtica de ponteiros Referenciando elementos dos vetores

Referenciando elementos dos vetores com ponteiros

Para um vetor unidimensional vet, a referncia


vet[i] corresponde a *(vet + i).
Para um vetor bidimensional vet, a referncia
vet[i][j] corresponde a *(*(vet + i) + j).
Para um vetor multidimensional vet, a referncia
vet[i1 ][i2 ]. . .[in ] corresponde a
*(. . .*(*(vet + i1 ) + i2 ) + . . . + in ).

() Elementos de programao em C 43 / 49
Aritmtica de ponteiros Referenciando elementos dos vetores

Referenciando elementos dos vetores com ponteiros

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

Referenciando elementos dos vetores com ponteiros


Dois modos de usar ponteiros para referenciar os elementos de uma matriz:
Apenas ponteiros
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 ");
}
}

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

Definindo tipos vetores

Na definio 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] Declara o tipo vA_t como


sinnimo de int [10].
typedef char vB_t[3][6] Declara o tipo vB_t como
sinnimo de char [3][6].
typedef float vC_t[][34] Declara o tipo vC_t como
sinnimo de float [][34].

() Elementos de programao em C 46 / 49
Qualificando as variveis do tipo vetor

Qualificando as variveis do tipo vetor

int const vet[x] A varivel vet declarada como um vetor de


int const.
int vet[const x] A varivel vet constante, declarada como um
vetor de int.
int vet[static 23] A varivel vet um vetor de int, com (a
expectativa de) pelo menos 23 elementos.

() Elementos de programao em C 47 / 49
Qualificando as variveis do tipo vetor

Qualificando as variveis do tipo vetor

int const vet[x] A varivel vet declarada como um vetor de


int const.
int vet[const x] A varivel vet constante, declarada como um
vetor de int.
int vet[static 23] A varivel vet um vetor de int, com (a
expectativa de) pelo menos 23 elementos.

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

Compatibilidade de vetores e ponteiros

Dois vetores so compatveis se


o tipo dos seus elementos so compatveis,
possuem as mesmas dimenses e
os especificadores de tamanho, se existirem e forem constantes, tm o
mesmo valor.

() Elementos de programao em C 48 / 49
Compatibilidade de vetores e ponteiros

Compatibilidade de vetores e ponteiros

Dois vetores so compatveis se


o tipo dos seus elementos so compatveis,
possuem as mesmas dimenses e
os especificadores de tamanho, se existirem e forem constantes, tm o
mesmo valor.

Dois ponteiros so compatveis se


possuem os mesmos qualificadores e
apontam para tipos compatveis.

() 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

You might also like