Você está na página 1de 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 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

Ponteiro para char

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

Declaraes vlidas: int **ptr_a; int * const ptr_a;

const int * ptr_a;

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

* ptr_a Ponteiro para * ptr_b Ponteiro (const) para * const ptr_c

Ponteiro para int *

Ponteiro para 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

0110 Contedo corresponde a um inteiro

0101 Contedo corresponde a um inteiro

1011 Contedo corresponde 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 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

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 cdigo ao lado?

# 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

Operador de acesso indireto

Operador de acesso indireto


Exemplo O que impresso pelo cdigo ao lado?

# 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

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); void (*fun)(void); Declara fun como uma funo sem argumentos retornando um ponteiro para 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); void (*fun)(void); int *fun(int); int (*fun)(int); Declara fun como uma funo sem argumentos retornando um ponteiro para void. Declara fun como um ponteiro para uma funo sem argumentos retornando void. Declara fun como uma funo de int retornando um ponteiro para 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

DeclaradorVetor ::= Identicador DeclDim ::= | | | [ [ [ [

DeclDim { DeclDim }

[ ListaQualifTipo ] [ QtdElmDim ] ] static [ ListaQualifTipo ] QtdElmDim ] ListaQualifTipo static QtdElmDim ] [ ListaQualifTipo ] * ] QualifTipo

ListaQualifTipo ::= QualifTipo | ListaQualifTipo

QtdElmDim ::= Expresso do tipo inteiro denindo o tamanho da dimenso do vetor.

()

Elementos de programao em C

15 / 49

Vetores

Declarao de vetores

Declarao de vetores

int alunos[3]; double alunos[2][3];

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

Tipo dos vetores

Tipo dos 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

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]; double alunos[2][3]; char *alunos[]; char *alunos[2 + x]; long [*] Vetor do tipo int[3]. Tipo completo.

()

Elementos de programao em C

18 / 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 [*] Vetor do tipo int[3]. Tipo completo. Vetor do tipo double[2][3]. Tipo completo.

()

Elementos de programao em C

18 / 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 [*] Vetor do tipo int[3]. Tipo completo. Vetor do tipo double[2][3]. Tipo completo. Vetor do tipo char *[]. Tipo incompleto.

()

Elementos de programao em C

18 / 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 [*] Vetor do tipo int[3]. Tipo completo. Vetor do tipo double[2][3]. Tipo completo. Vetor do tipo char *[]. Tipo incompleto. Vetor do tipo char *[2 + x]. Tipo varivel (porm completo).

()

Elementos de programao em C

18 / 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 [*] Vetor do tipo int[3]. Tipo completo. Vetor do tipo double[2][3]. Tipo completo. Vetor do tipo char *[]. Tipo incompleto. Vetor do tipo char *[2 + x]. Tipo varivel (porm completo). Vetor do tipo long [*]. Tipo varivel (de tamanho no especicado, porm completo).

()

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

vet[3]++; --vet[3]; (vet[3] > 2)


()

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

Vetores unidimensionais tamanho varivel


Exemplo O programa ao lado l uma quantidade de nmeros inteiros especicada pelo usurio, armazenando-os em um vetor de int, e imprime os nmeros lidos, aps a leitura.
# include < stdio .h > int main ( void ) { int qtd ; printf (" Digite a qtd elms : "); scanf ("% d " , & qtd ); int vetnum [ qtd ]; for ( int i = 0; i < qtd ; i ++) { printf (" digite elm % d : " , i ); 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 quantidade de nmeros inteiros especicada pelo usurio, armazenando-os em um vetor de int. Aps a leitura a funo imp_vet chamada para imprimir o vetor lido.
# include < stdio .h > void imp_vet ( int , int [*]); int main ( void ) { int qtd ; printf (" Digite a qtd elms : "); scanf ("% d " , & qtd ); int vetnum [ qtd ]; for ( int i = 0; i < qtd ; i ++) { printf (" digite elm % d : " , i ); scanf ("% d " , & vetnum [ i ]); } 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 ]); } }
23 / 49

()

Elementos de programao em C

Vetores unidimensionais

Exemplos

Vetores unidimensionais incompletos


Exemplo prg_vetA.c
# include < stdio .h > extern char estado []; extern int qtd ; void inicia_vet ( char ); void imp_vet ( char []); int main ( void ) { inicia_vet ( a ); imp_vet ( estado ); return 0; } void imp_vet ( char v []) { for ( int i = 0; i < qtd ; i ++) { printf ("% c " , v [ i ]); } }

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

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
Elementos de programao em C

A[3][0] = j
26 / 49

Vetores multidimensionais

Declarao

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

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

Vetores multidimensionais declarao

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

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

short int alunos[3][2 + x];

()

Elementos de programao em C

29 / 49

Vetores multidimensionais

Tipo dos vetores multidimensionais

Vetores multidimensionais tipo


long *vetA[2][3]
Expresso Tipo

vetA vetA[1] vetA[1][2]

long *[2][3] long *[3] long *

()

Elementos de programao em C

30 / 49

Vetores multidimensionais

Tipo dos vetores multidimensionais

Vetores multidimensionais tipo


long *vetA[2][3]
Expresso Tipo

vetA vetA[1] vetA[1][2]

long *[2][3] long *[3] long *

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


Expresso Tipo

vetB vetB[1] vetB[1][2] vetB[1][0][1]

const const const const

char[2][3][x] char[3][x] char[x] char

()

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

int C , int m [ L ][ C ]) { < L ; i ++) { j < C ; j ++) { m [ i ][ j ]);

()

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

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

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

fatorRH[2] e {"B", "+"} fatorRH[2][0] "B" fatorRH[2][1] "+"

4 5

fatorRH[3] e {"B", "-"}


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

fatorRH[0] e "A" fatorRH[0][0] "A" fatorRH[0][1] "+"

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

fatorRH[2] e {"B"} fatorRH[2][0] "B" fatorRH[2][1] NULL

4 5

fatorRH[3] e {"O", "+"}


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

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

fatorRH[5] e {"A", "-"} fatorRH[5][0] "O" fatorRH[5][1] "-"

fatorRH[6] e {"AB", "+"} fatorRH[6][0] "AB" fatorRH[6][1] "+"

4 5

fatorRH[1] e {"A", "-"}


() 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, 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 e literais compostos

Iniciao com cadeias de caracteres e literais compostos

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

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


Expresso vet vet[x] vet[1][0] vet[x][y][w] Tipo char[3][2][4] char[2][4] char[4] char Convertido em char (*)[2][4]. char (*)[4]. 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 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

Para variveis ptrA e ptrB do tipo ponteiro para T :


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

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 imprime, na ordem inversa que foram digitados, um vetor de N nmeros.

# 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

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 , for ( int i = 0; i for ( int j = 0; printf ("% d " , } printf ("\ n "); } } int C , int m [ L ][ C ]) { < L ; i ++) { j < C ; j ++) { *(*( m + i ) + j ));

Ponteiros e ndices
void imp_vet ( int L , for ( int i = 0; i for ( int j = 0; printf ("% d " , } printf ("\ n "); } }
()

int C , int m [ L ][ C ]) { < L ; i ++) { j < C ; j ++) { (*( m + i ))[ j ]);

Elementos de programao em C

45 / 49

Denindo tipos vetores

Denindo tipos vetores

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

Qualicando as variveis do tipo vetor

Qualicando as variveis do tipo vetor

int const vet[x] int vet[const x] int vet[static 23]

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

Qualicando as variveis do tipo vetor

Qualicando as variveis do tipo vetor

int const vet[x] int vet[const x] int vet[static 23]

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

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 especicadores 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 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