Strings
Matrizes
Arrays de Ponteiros
Ponteiros
M arcio Moretto Ribeiro marciomr@usp.br
Escola de Artes Ci encias e Humanidades USP
19 de Mar co de 2013
EACH
Strings
Matrizes
Arrays de Ponteiros
Slides
EACH
Strings
Matrizes
Arrays de Ponteiros
Resumo da aula
Endere cos e ponteiros. Arrays e aritm etica com endere cos. Strings. Matrizes. Arrays de ponteiros (argc e argv).
EACH
Strings
Matrizes
Arrays de Ponteiros
Resumo da aula
Endere cos e ponteiros. Arrays e aritm etica com endere cos. Strings. Matrizes. Arrays de ponteiros (argc e argv).
EACH
Strings
Matrizes
Arrays de Ponteiros
Resumo da aula
Endere cos e ponteiros. Arrays e aritm etica com endere cos. Strings. Matrizes. Arrays de ponteiros (argc e argv).
EACH
Strings
Matrizes
Arrays de Ponteiros
Resumo da aula
Endere cos e ponteiros. Arrays e aritm etica com endere cos. Strings. Matrizes. Arrays de ponteiros (argc e argv).
EACH
Strings
Matrizes
Arrays de Ponteiros
Resumo da aula
Endere cos e ponteiros. Arrays e aritm etica com endere cos. Strings. Matrizes. Arrays de ponteiros (argc e argv).
EACH
Strings
Matrizes
Arrays de Ponteiros
int a ; Quando declaramos uma vari avel, e reservado um espa co de mem oria de tamanho adequado (tamanho de um inteiro neste caso). As vezes eu til saber o endere co desse espa co de mem oria. Em C acessamos esse valor usando o s mbolo & antes do nome da vari avel.
& a ; /* endereco de a */
EACH
Strings
Matrizes
Arrays de Ponteiros
int a ; Quando declaramos uma vari avel, e reservado um espa co de mem oria de tamanho adequado (tamanho de um inteiro neste caso). As vezes eu til saber o endere co desse espa co de mem oria. Em C acessamos esse valor usando o s mbolo & antes do nome da vari avel.
& a ; /* endereco de a */
EACH
Strings
Matrizes
Arrays de Ponteiros
Ponteiros
int a ; int b = & a ; > gcc ponteiros.c ponteiros.c: Na fun c~ ao main: ponteiros.c:7:5: warning: assignment makes integer from pointer without a cast [habilitado por padr~ ao]
EACH
Strings
Matrizes
Arrays de Ponteiros
Ponteiros
int a ; int b = & a ; > gcc ponteiros.c ponteiros.c: Na fun c~ ao main: ponteiros.c:7:5: warning: assignment makes integer from pointer without a cast [habilitado por padr~ ao]
EACH
Strings
Matrizes
Arrays de Ponteiros
Ponteiros
int a ; printf ( " % d \ n " , & a ); > gcc ponteiros.c ponteiros.c: Na fun c~ ao main: ponteiros.c:7:3: warning: format %d espera argumento do tipo int, por em o argumento 2 possui tipo int * [-Wformat]
EACH
Strings
Matrizes
Arrays de Ponteiros
Ponteiros
int a ; printf ( " % d \ n " , & a ); > gcc ponteiros.c ponteiros.c: Na fun c~ ao main: ponteiros.c:7:3: warning: format %d espera argumento do tipo int, por em o argumento 2 possui tipo int * [-Wformat]
EACH
Strings
Matrizes
Arrays de Ponteiros
Ponteiros
1 2 3
int a ; int * b ; b = &a; b e um ponteiro para int que aponta para a vari avel a.
EACH
Strings
Matrizes
Arrays de Ponteiros
Ponteiros
1 2 3
int a ; int * b ; b = &a; b e um ponteiro para int que aponta para a vari avel a.
EACH
Strings
Matrizes
Arrays de Ponteiros
Ponteiros
1 2 3 4 5 6
EACH
Strings
Matrizes
Arrays de Ponteiros
Ponteiros
int a ; int * b ; b = &a; * b = 4; printf ( " % d \ n " , * b ); printf ( " % d \ n " , a ); A linha 5 altera o conte udo do local apontado por b. > a.out 4 4
1 2 3 4 5 6
EACH
Strings
Matrizes
Arrays de Ponteiros
Ponteiros
int a ; int * b ; b = &a; * b = 4; printf ( " % d \ n " , * b ); printf ( " % d \ n " , a ); A linha 5 altera o conte udo do local apontado por b. > a.out 4 4
1 2 3 4 5 6
EACH
Strings
Matrizes
Arrays de Ponteiros
Ponteiros
1 2
EACH
Strings
Matrizes
Arrays de Ponteiros
Ponteiros
1 2
EACH
Strings
Matrizes
Arrays de Ponteiros
Ponteiros
1 2
int a ; printf ( " % p \ n " , & a ); > gcc ponteiros.c > a.out 0x7fff01e090fc
EACH
Strings
Matrizes
Arrays de Ponteiros
Ponteiros
1 2
int a ; printf ( " % p \ n " , & a ); > gcc ponteiros.c > a.out 0x7fff01e090fc
EACH
Strings
Matrizes
Arrays de Ponteiros
printf (cont.)
%c %d %u %ld %f %lf %p %x %s %%
caracteres (char). inteiros decimais com sinal (int). inteiros decimais sem sinal (unsigned int). inteiros longos (long). n umeros com ponto utuante (float). n umeros com ponto utuante de dupla precis ao (double). ponteiros (int*, double*, float* etc.). inteiros em hexadecimal. string. imprime o s bolo %
EACH
Strings
Matrizes
Arrays de Ponteiros
void troca ( int x , int y ){ int tmp = x ; x = y; y = tmp ; } main (){ int n = 4; int m = 5; troca (n , m ); printf ( " n =% d m =% d \ n " , n , m ); } n=4 m=5
EACH
Strings
Matrizes
Arrays de Ponteiros
void troca ( int x , int y ){ int tmp = x ; x = y; y = tmp ; } main (){ int n = 4; int m = 5; troca (n , m ); printf ( " n =% d m =% d \ n " , n , m ); } n=4 m=5
EACH
Strings
Matrizes
Arrays de Ponteiros
void troca ( int *x , int * y ){ int tmp = * x ; *x = *y; * y = tmp ; } main (){ int n = 4; int m = 5; troca (& n ,& m ); printf ( " n =% d m =% d \ n " , n , m ); } n=5 m=4
EACH
Strings
Matrizes
Arrays de Ponteiros
void troca ( int *x , int * y ){ int tmp = * x ; *x = *y; * y = tmp ; } main (){ int n = 4; int m = 5; troca (& n ,& m ); printf ( " n =% d m =% d \ n " , n , m ); } n=5 m=4
EACH
Strings
Matrizes
Arrays de Ponteiros
void troca ( int *x , int * y ){ int tmp = * x ; *x = *y; * y = tmp ; } main (){ int n = 4; int m = 5; troca (& n ,& m ); printf ( " n =% d m =% d \ n " , n , m ); } n=5 m=4
EACH
Strings
Matrizes
Arrays de Ponteiros
void troca ( int *x , int * y ){ int tmp = * x ; *x = *y; * y = tmp ; } main (){ int n = 4; int m = 5; troca (& n ,& m ); printf ( " n =% d m =% d \ n " , n , m ); } n=5 m=4
EACH
Strings
Matrizes
Arrays de Ponteiros
Exerc cio 1: Escreva uma fun c ao que receba os coecientes de uma equa c ao de segundo grau e calcula suas raizes.
EACH
Strings
Matrizes
Arrays de Ponteiros
Arrays (vetores)
1 2 3 4 5 6 7 8 9
# define MAX 3 main (){ int i ; int a [ MAX ]; a [0] = 1; a [1] = 4; a [2] = 2; for ( i = 0; i < 3; i ++) printf ( " % d \ n " , a [ i ]); } 1 4 2
EACH
Strings
Matrizes
Arrays de Ponteiros
Arrays (vetores)
1 2 3 4 5 6 7 8 9
# define MAX 3 main (){ int i ; int a [ MAX ]; a [0] = 1; a [1] = 4; a [2] = 2; for ( i = 0; i < 3; i ++) printf ( " % d \ n " , a [ i ]); } 1 4 2
EACH
Strings
Matrizes
Arrays de Ponteiros
Arrays (vetores)
main (){ int i ; int a [] = {1 ,4 ,2}; for ( i = 0; i < 3; i ++) printf ( " % d \ n " , a [ i ]); } 1 4 2
1 2 3 4 5 6 7
EACH
Strings
Matrizes
Arrays de Ponteiros
Arrays (vetores)
main (){ int i ; int a [] = {1 ,4 ,2}; for ( i = 0; i < 3; i ++) printf ( " % d \ n " , a [ i ]); } 1 4 2
1 2 3 4 5 6 7
EACH
Strings
Matrizes
Arrays de Ponteiros
Arrays
(int a[MAX]), e reservada uma por c ao cont gua da mem oria de MAX vezes o tamanho de um int.
Quando declaramos int a[] = {1,4,2}, e reservado um
espa co suciente para inicializar o array com os valores entre chaves (no caso 3 vezes o tamanho de um int).
Para acessar (alterar) o i- esimo valor desse array usamos a
sintaxe (a[i]).
M arcio M. Ribeiro Aula 3 EACH
Strings
Matrizes
Arrays de Ponteiros
Arrays
(int a[MAX]), e reservada uma por c ao cont gua da mem oria de MAX vezes o tamanho de um int.
Quando declaramos int a[] = {1,4,2}, e reservado um
espa co suciente para inicializar o array com os valores entre chaves (no caso 3 vezes o tamanho de um int).
Para acessar (alterar) o i- esimo valor desse array usamos a
sintaxe (a[i]).
M arcio M. Ribeiro Aula 3 EACH
Strings
Matrizes
Arrays de Ponteiros
Arrays
(int a[MAX]), e reservada uma por c ao cont gua da mem oria de MAX vezes o tamanho de um int.
Quando declaramos int a[] = {1,4,2}, e reservado um
espa co suciente para inicializar o array com os valores entre chaves (no caso 3 vezes o tamanho de um int).
Para acessar (alterar) o i- esimo valor desse array usamos a
sintaxe (a[i]).
M arcio M. Ribeiro Aula 3 EACH
Strings
Matrizes
Arrays de Ponteiros
Arrays e ponteiros
1 2 3
EACH
Strings
Matrizes
Arrays de Ponteiros
Arrays e ponteiros
O que signica a seguinte express ao?
1
*( pa + 1); pa + 1 e o endere co do pr oximo inteiro i.e. pa + 1 e o endere co de a[1]. De forma mais geral, pa + i e o endere co de a[i].
EACH
Strings
Matrizes
Arrays de Ponteiros
Arrays e ponteiros
O que signica a seguinte express ao?
1
*( pa + 1); pa + 1 e o endere co do pr oximo inteiro i.e. pa + 1 e o endere co de a[1]. De forma mais geral, pa + i e o endere co de a[i].
EACH
Strings
Matrizes
Arrays de Ponteiros
Arrays e ponteiros
O que signica a seguinte express ao?
1
*( pa + 1); pa + 1 e o endere co do pr oximo inteiro i.e. pa + 1 e o endere co de a[1]. De forma mais geral, pa + i e o endere co de a[i].
EACH
Strings
Matrizes
Arrays de Ponteiros
Arrays e ponteiros
O que signica a seguinte express ao?
1
*( pa + 1); pa + 1 e o endere co do pr oximo inteiro i.e. pa + 1 e o endere co de a[1]. De forma mais geral, pa + i e o endere co de a[i].
EACH
Strings
Matrizes
Arrays de Ponteiros
Arrays e ponteiros
Note que em C o nome do array indica seu endere co inicial i.e. quando declaramos int a[MAX] temos que a e o mesmo que &a[0]. Logo, a express ao a[i] nada mais e do que uma abrevia c ao para *(a + i).
EACH
Strings
Matrizes
Arrays de Ponteiros
Arrays e ponteiros
Note que em C o nome do array indica seu endere co inicial i.e. quando declaramos int a[MAX] temos que a e o mesmo que &a[0]. Logo, a express ao a[i] nada mais e do que uma abrevia c ao para *(a + i).
EACH
Strings
Matrizes
Arrays de Ponteiros
ent ao podemos comparar qual vem antes ou depois no vetor usando os s mbolos <, >, <=, >=, == e !=.
Subtra c ao: se p e q apontam para membros de um vetor
ent ao podemos subtra -los para saber a dist ancia entre eles.
1 2
EACH
Strings
Matrizes
Arrays de Ponteiros
ent ao podemos comparar qual vem antes ou depois no vetor usando os s mbolos <, >, <=, >=, == e !=.
Subtra c ao: se p e q apontam para membros de um vetor
ent ao podemos subtra -los para saber a dist ancia entre eles.
1 2
EACH
Strings
Matrizes
Arrays de Ponteiros
ent ao podemos comparar qual vem antes ou depois no vetor usando os s mbolos <, >, <=, >=, == e !=.
Subtra c ao: se p e q apontam para membros de um vetor
ent ao podemos subtra -los para saber a dist ancia entre eles.
1 2
EACH
Strings
Matrizes
Arrays de Ponteiros
ent ao podemos comparar qual vem antes ou depois no vetor usando os s mbolos <, >, <=, >=, == e !=.
Subtra c ao: se p e q apontam para membros de um vetor
ent ao podemos subtra -los para saber a dist ancia entre eles.
1 2
EACH
Strings
Matrizes
Arrays de Ponteiros
ent ao podemos comparar qual vem antes ou depois no vetor usando os s mbolos <, >, <=, >=, == e !=.
Subtra c ao: se p e q apontam para membros de um vetor
ent ao podemos subtra -los para saber a dist ancia entre eles.
1 2
EACH
Strings
Matrizes
Arrays de Ponteiros
Strings
Uma cadeia de caracteres da forma "Ola C!" e um array de caracteres (char) terminada por um caracter nulo (\0).
1 2 3 4 5 6
int i ; char * a = " java " ; for ( i = 0; a [ i ] != \0 ; i ++) printf ( " % c " , a [ i ]); printf ( " \ n " ); java
EACH
Strings
Matrizes
Arrays de Ponteiros
Strings
Uma cadeia de caracteres da forma "Ola C!" e um array de caracteres (char) terminada por um caracter nulo (\0).
1 2 3 4 5 6
int i ; char * a = " java " ; for ( i = 0; a [ i ] != \0 ; i ++) printf ( " % c " , a [ i ]); printf ( " \ n " ); java
EACH
Strings
Matrizes
Arrays de Ponteiros
Strings
Uma cadeia de caracteres da forma "Ola C!" e um array de caracteres (char) terminada por um caracter nulo (\0).
1 2 3 4 5 6
int i ; char a [] = " java " ; for ( i = 0; a [ i ] != \0 ; i ++) printf ( " % c " , a [ i ]); printf ( " \ n " ); java
EACH
Strings
Matrizes
Arrays de Ponteiros
Strings
EACH
Strings
Matrizes
Arrays de Ponteiros
Strings
char * a = " java " ; a [2] = c ; printf ( " % s \ n " , a ); Falha de segmenta c~ ao (imagem do n ucleo gravada)
EACH
Strings
Matrizes
Arrays de Ponteiros
strcpy
strcpy(t,s) e uma fun c ao da biblioteca string.h que copia uma cadeia de caracteres s em uma cadeia de caracteres t:
1 2 3 4 5 6 7 8 9
# include < stdio .h > # include < string .h > # define MAX 20 main (){ char a [] = " java " ; char b [ MAX ]; strcpy (b , a ); printf ( " % s \ n % s \ n " , a , b ); } java java
EACH
Strings
Matrizes
Arrays de Ponteiros
strcpy
strcpy(t,s) e uma fun c ao da biblioteca string.h que copia uma cadeia de caracteres s em uma cadeia de caracteres t:
1 2 3 4 5 6 7 8 9
# include < stdio .h > # include < string .h > # define MAX 20 main (){ char a [] = " java " ; char b [ MAX ]; strcpy (b , a ); printf ( " % s \ n % s \ n " , a , b ); } java java
EACH
Strings
Matrizes
Arrays de Ponteiros
strcpy (vers ao 1)
EACH
Strings
Matrizes
Arrays de Ponteiros
strcpy (vers ao 2)
EACH
Strings
Matrizes
Arrays de Ponteiros
strcpy (vers ao 3)
EACH
Strings
Matrizes
Arrays de Ponteiros
strcpy (vers ao 4)
EACH
Strings
Matrizes
Arrays de Ponteiros
strcmp
EACH
Strings
Matrizes
Arrays de Ponteiros
strcmp
1 2 3 4 5 6 7 8 9 10 11
# include < stdio .h > # include < string .h > main (){ char * a = " java " ; char * b = " jaca " ; if ( strcmp (a , b ) < 0) /* a < b */ printf ( " % s \ t % s \ n " , a , b ); else if (! strcmp (a , b )) /* a = b */ printf ( " % s \ n " , a ); else /* a > b */ printf ( " % s \ t % s \ n " , b , a ); } jaca java
EACH
Strings
Matrizes
Arrays de Ponteiros
strcmp
1 2 3 4 5 6 7 8 9 10 11
# include < stdio .h > # include < string .h > main (){ char * a = " java " ; char * b = " jaca " ; if ( strcmp (a , b ) < 0) /* a < b */ printf ( " % s \ t % s \ n " , a , b ); else if (! strcmp (a , b )) /* a = b */ printf ( " % s \ n " , a ); else /* a > b */ printf ( " % s \ t % s \ n " , b , a ); } jaca java
EACH
Strings
Matrizes
Arrays de Ponteiros
strcmp (vers ao 1)
EACH
Strings
Matrizes
Arrays de Ponteiros
strcmp (vers ao 2)
EACH
Strings
Matrizes
Arrays de Ponteiros
Matrizes
Matrizes nada mais s ao do que arrays bidimensionais.
1 2 3 4 5 6 7 8 9 10
main (){ int l , c ; int a [2][3]; a [0][0] = 1; a [0][1] = 4; a [0][2] = 2; a [1][0] = 4; a [1][1] = 2; a [1][2] = 1; for ( l = 0; l < 2; l ++){ for ( c = 0; c < 3; c ++) printf ( " % d " , a [ l ][ c ]); printf ( " \ n " ); } } 1 4 2 4 2 1
EACH
Strings
Matrizes
Arrays de Ponteiros
Matrizes
Matrizes nada mais s ao do que arrays bidimensionais.
1 2 3 4 5 6 7 8 9 10
main (){ int l , c ; int a [2][3]; a [0][0] = 1; a [0][1] = 4; a [0][2] = 2; a [1][0] = 4; a [1][1] = 2; a [1][2] = 1; for ( l = 0; l < 2; l ++){ for ( c = 0; c < 3; c ++) printf ( " % d " , a [ l ][ c ]); printf ( " \ n " ); } } 1 4 2 4 2 1
EACH
Strings
Matrizes
Arrays de Ponteiros
Matrizes
A declar c ao int a[2][3] reserva um espa co de mem oria de tamanho 2 3 vezes o tamanho de um int.
EACH
Strings
Matrizes
Arrays de Ponteiros
Matrizes
A declar c ao int a[2][3] reserva um espa co de mem oria de tamanho 2 3 vezes o tamanho de um int.
EACH
Strings
Matrizes
Arrays de Ponteiros
Arrays de Ponteiros
1
int * a [6]; A declara c ao acima reserva um array com seis ponteiros para int.
EACH
Strings
Matrizes
Arrays de Ponteiros
Arrays de Ponteiros
1
int * a [6]; A declara c ao acima reserva um array com seis ponteiros para int.
EACH
Strings
Matrizes
Arrays de Ponteiros
argc e argv
fun c ao main.
argc cont em o n umero de par ametros passados na linha de
EACH
Strings
Matrizes
Arrays de Ponteiros
argc e argv
fun c ao main.
argc cont em o n umero de par ametros passados na linha de
EACH
Strings
Matrizes
Arrays de Ponteiros
argc e argv
fun c ao main.
argc cont em o n umero de par ametros passados na linha de
EACH
Strings
Matrizes
Arrays de Ponteiros
argc e argv
1 2 3 4 5
main ( int argc , char * argv []){ printf ( " % d \ n " , argc ); printf ( " % s \ n " , argv [0]); printf ( " % s \ n " , argv [1]); } > a.out 42 a.out 42
EACH
Strings
Matrizes
Arrays de Ponteiros
argc e argv
1 2 3 4 5
main ( int argc , char * argv []){ printf ( " % d \ n " , argc ); printf ( " % s \ n " , argv [0]); printf ( " % s \ n " , argv [1]); } > a.out 42 a.out 42
EACH
Strings
Matrizes
Arrays de Ponteiros
echo
EACH
Strings
Matrizes
Arrays de Ponteiros
echo
EACH
Strings
Matrizes
Arrays de Ponteiros
echo
1 2 3 4 5 6 7 8 9
main ( int argc , char * argv []){ int i ; for ( i = 1; i < argc ; i ++){ printf ( " % s " , argv [ i ]); if ( i < argc - 1) printf ( " " ); } printf ( " \ n " ); } > a.out 42 4 2 a.out 42 4 2
EACH
Strings
Matrizes
Arrays de Ponteiros
echo
1 2 3 4 5 6 7 8 9
main ( int argc , char * argv []){ int i ; for ( i = 1; i < argc ; i ++){ printf ( " % s " , argv [ i ]); if ( i < argc - 1) printf ( " " ); } printf ( " \ n " ); } > a.out 42 4 2 a.out 42 4 2
EACH
Strings
Matrizes
Arrays de Ponteiros
echo (vers ao 2)
1 2 3 4 5
main ( int argc , char * argv []){ while ( - - argc > 0) printf (( argc > 1) ? " % s " : " % s " , *++ argv ); printf ( " \ n " ); }
EACH
Strings
Matrizes
Arrays de Ponteiros
echo (vers ao 2)
1 2 3 4 5
main ( int argc , char * argv []){ while ( - - argc > 0) printf (( argc > 1) ? " % s " : " % s " , *++ argv ); printf ( " \ n " ); }
EACH
Strings
Matrizes
Arrays de Ponteiros
char * mes [] = { " jan " , " fev " , " mar " , " abr " , " mai " , " jun " , " jul " , " ago " , " set " , " out " , " nov " , " dez " };
EACH
Strings
Matrizes
Arrays de Ponteiros
1 2
char mes [][3] = { " jan " , " fev " , " mar " , " abr " , " mai " , " jun " , " jul " , " ago " , " set " , " out " , " nov " , " dez " };
EACH
Strings
Matrizes
Arrays de Ponteiros
Jogo da velha
Exerc cio 2: Escrever um jogo da velha.
>jogador 1: 1 1 o x - o - - >jogador 2: 1 1 jogada invalida! >jogador 2: 1 2 o x - o x - - >jogador 1: 2 2 o x - o x - - o jogador 1 venceu!
EACH
Strings
Matrizes
Arrays de Ponteiros
Pr oxima Aula
EACH