Aula 4 Cristiano Dalbem Dennis Balreira Gabriel Moreira Miller Biazus Raphael Lupchinski Universidade Federal do Rio Grande do Sul Instituto de Informática Grupo PET Computação
Sintaxe Funções Exemplos
Sintaxe Funções Exemplos são vetores de caracteres.
Sintaxe Funções Exemplos são vetores de caracteres. Não fazem parte dos tipos primitivos da linguagem C; necessitam da biblioteca string.h para utlização de funções.
Sintaxe Funções Exemplos são vetores de caracteres. Não fazem parte dos tipos primitivos da linguagem C; necessitam da biblioteca string.h para utlização de funções. Terminam com um caractere especial, indicando nal de string.
Sintaxe Sintaxe Funções Exemplos 1 char nome_string [ q u a n t i d a d e _ d e _ c a r a c t e r e s + 1 ] ;
Sintaxe Sintaxe Funções Exemplos 1 // Exemplo: 2 char p [ 8 ] = " P a l a v r a " ; 3 char p [ 8 ] = { 'P ', ' a ', ' l ', ' a ', ' v ', ' r ', ' a ', ' \0 ' } ; 4 // ambas as declaraçoes acima sao equivalentes
Funções Sintaxe Funções Exemplos Leitura Função gets(). 1 g e t s ( nome_string ) ;
Funções Sintaxe Funções Exemplos Escrita Função printf() através de %s. 1 p r i n t f ( "... %s... ", nome_string ) ;
Funções Sintaxe Funções Exemplos Copia Função strcpy(). 1 s t r c p y ( nome_string_destino, nome_string_fonte ) ; 2 / c o p i a s t r i n g _ f o n t e para s t r i n g _ d e s t i n o /
Funções Sintaxe Funções Exemplos Compara Função strcmp(). 1 strcmp ( nome_string1, nome_string2 ) ; 2 / compara s t r i n g 1 com s t r i n g 2, 3 r e t o r n a n d o 0 caso forem i g u a i s /
Funções Sintaxe Funções Exemplos Tamanho Função strlen(). 1 s t r l e n ( nome_string ) ; 2 / r e t o r n a o tamanho da s t r i n g /
Funções Sintaxe Funções Exemplos Concatena Função strcat(). 1 s t r c a t ( nome_string_destino, nome_string_fonte ) ; 2 / a c o p l a s t r i n g _ f o n t e no f i n a l da s t r i n g _ d e s t i n o /
Exemplos Sintaxe Funções Exemplos Ex. 1 1 #i n c l u d e <s t d i o. h> 2 #i n c l u d e < s t r i n g. h> 3 i n t main ( ) { 4 char nome1 [ 4 0 ], nome2 [ 4 0 ] ; 5 p r i n t f ( "Nome1 : " ) ; 6 g e t s ( nome1 ) ; 7 p r i n t f ( "Nome2 : " ) ; 8 g e t s ( nome2 ) ; 9 s t r c a t ( nome1, nome2 ) ; 10 p r i n t f ( "Nome1 : %s \nnome2 : %s ", nome1, nome2 ) ; 11 s t r c p y ( nome2, nome1 ) ; 12 p r i n t f ( "Nome1 : %s \nnome2 : %s ", nome1, nome2 ) ; 13 r e t u r n ( 0 ) ; 14 }
Exemplos Sintaxe Funções Exemplos Ex. 2 1 #i n c l u d e <s t d i o. h> 2 #i n c l u d e < s t r i n g. h> 3 i n t main ( ) { 4 char nome1 [ 4 0 ], nome2 [ 4 0 ] ; 5 p r i n t f ( "Nome1 : " ) ; 6 g e t s ( nome1 ) ; 7 p r i n t f ( "Nome2 : " ) ; 8 g e t s ( nome2 ) ; 9 p r i n t f ( "Tamanho de \"%s \ " : %d", nome2, s t r l e n ( nome2 ) ) ; 10 i f ( strcmp ( nome1, nome2 ) == 0) 11 p r i n t f ( "\n%s e %s sao i g u a i s! ", nome1, nome2 ) ; 12 e l s e 13 p r i n t f ( "\n%s e %s sao d i f e r e n t e s! ", nome1, nome2 ) ; 14 r e t u r n ( 0 ) ; 15 }
Aritmética de
Aritmética de Variáveis são, na realidade, rótulos para posições de memória. Nossos dados estão armazenados na memória, e nós os acessamos através das variáveis.
Aritmética de Endereço Conteúdo...... 501 502 503 504 505...... Tabela: Memória
Aritmética de Observe o seguinte código: 1 i n t main ( ) 2 { 3 i n t a = 6 ; 4 i n t b [ 5 ] = { 1, 2, 3, 4, 5 } ; 5 i n t c ; // não inicializado 6 i n t d = 1 0 ; 7 }
Aritmética de Agora nossa memória poderia estar assim: Rótulo Endereço Conteúdo......... a 501 6 b[0] 502 1 b[1] 503 2 b[2] 504 3 b[3] 505 4 b[4] 506 5 c 507?? d 508 10......... Tabela: Memória
Aritmética de Uma variável armazena um valor de um determinado tipo - int, oat, char... - Ex.: int v = 2; // variavel v do tipo inteiro, com valor 2 são variáveis que armazenam endereços de memória. Geralmente o endereço de uma outra variável. Um ponteiro pode conter o endereço de uma variável. Quando isso ocorre dizemos que ele aponta para aquela variável.
Sintaxe Aritmética de Formato da declaração: tipo *variavel Importante: o '*' usado na declaração de uma variável é diferente do '*' utilizado para operações aritméticas Exemplos: Variável normal Variável ponteiro int x; int x; oat f ; oat f ; char c; char c;
Exemplo - Declarando ponteiro Aritmética de 1 #include <s t d i o. h> 2 i n t main ( ) { 3 i n t pt ; //ponteiro não inicializado 4 //(contém lixo - endereço qualquer) 5 i n t a = 5 ; 6 i n t b = 1 2 ; 7 p t = &a //ponteiro inicializado - aponta para endereço de a 8 p r i n t f ( " E n d e r e c o f i s i c o de pt (& pt ) : %p\n",& pt ) ; 9 p r i n t f ( " Conteudo de pt ( pt ) : %p\n", pt ) ; 10 p r i n t f ( " Conteudo apontado p o r pt ( pt ) : %d\n" ), pt ) ; 11 p r i n t f ( " E n d e r e c o f i s i c o de a (&a ) : %p\n",&a ) ; 12 p r i n t f ( " Conteudo de a ( a ) : %d\n", a ) ; 13 p r i n t f ( " E n d e r e c o f i s i c o de b (&b ) : %p\n",&b ) ; 14 p r i n t f ( " Conteudo de b ( b ) : %d\n", b ) ; 15 r e t u r n 0 ; 16 }
Aritmética de Exemplo - Continuação... 0xbf8bef4c : Ponteiro pt. Endereço que aponta é o 0xbf8bef44 (endereço de a). Dizemos que pt aponta para a. 0xbf8bef44 : Inteiro a. Conteúdo é o valor 5. 0xbf8bef48 : Inteiro b. Conteúdo é o valor 12. Rótulo Endereço Conteúdo......... pt 0xbf8bef4c 0xbf8bef44 a 0xbf8bef44 5 b 0xbf8bef48 12......... Tabela: Memória
Aritmética de Operadores Operador & Operador unário que devolve o endereço do operando. Exemplo 1 i n t x ; 2 i n t p ; 3 4 p = &x ; // agora p aponta para x (contém endereço de x) No exemplo, o ponteiro 'p' recebe o endereço da variável 'x', pois o operador & aplicado à 'x' retorna o seu endereço.
Operadores Aritmética de Operador * Operador unário que devolve o conteúdo do endereço apontado pelo operando. Exemplo 1 i n t x = 1 2 ; 2 i n t p ; 3 4 p = &x ; 5 p r i n t f ( "%i \n", p ) ; Continuando do exemplo anterior, imprime 12, que é o conteúdo contido no endereço apontado por 'p' (endereço da variável 'x').
Operadores Aritmética de Na Prática a função scanf () é um ótimo exemplo de uso do & 1 i n t numero ; 2 s c a n f ( "%d", &numero ) ; 3 // Isso quer dizer: armazene o valor lido do teclado na variável cujo endereço eu estou lhe fornecendo
Atribuição Aritmética de É possível fazer atribuição de ponteiros como com qualquer outra variável. 1 i n t main ( ) 2 { 3 i n t a = 8, b = 4 2 ; 4 i n t p1, p2 ; 5 6 p1 = &a ; 7 p2 = &b ; 8 p1 = p2 ; 9 }
Exemplo Aritmética de 1 i n t main ( ) 2 { 3 i n t a = 1 0 ; 4 i n t p1 ; 5 6 p1 = &a ; 7 p r i n t f ( "&a : %d\n",&a ) ; 8 p r i n t f ( " p1 : %p\n", p1 ) ; 9 10 p r i n t f ( "a : %d\n", a ) ; 11 p r i n t f ( " p1 : %d\n", p1 ) ; 12 }
Alguns cuidados... Aritmética de Nunca deixe de inicializar seus ponteiros! não inicializados possuem lixo, então podem estar referenciando uma posição de memória qualquer.
Alguns cuidados... Aritmética de Isso quer dizer: podem estar apontando para alguma variável aleatória do seu programa. (ou parte de uma variável - uma variável pode ter tamanho de vários bytes) Ou ainda apontando para uma região de memória fora do espaço do seu programa!
Alguns cuidados... Aritmética de Pra evitar esse tipo de problema é comum inicializar nossos ponteiros com NULL já na declaração. 1 i n t main ( ) 2 { 3 i n t p i = NULL ; 4 f l o a t p f = NULL ; 5 }
Alguns cuidados... Aritmética de Isso é feito pois ca fácil de testar, durante o programa, se o ponteiro é "válido". 1... 2 i f ( p i ) 3 { 4 // pi contém um endereço 5 } 6 7 i f ( p f ) 8 { 9 // pf contém um endereço 10 }
Equivalência entre vetor e ponteiro Aritmética de vet[i] é igual a *(vet + i)
Aritmética de Aritmética de Duas operações aritméticas: Adição Subtração Em ambas as operações depende o tipo do ponteiro, pois a aritmética é feita byte a byte.
Aritmética de Aritmética de Adição 1 p i = p i + 1 ; // avança o número de bytes de um int 2 p f = p f + 1 ; // avança o número de bytes de um oat Subtração 1 p i = p i 1 ; // volta o número de bytes de um int 2 p f = p f 1 ; // volta o número de bytes de um oat
Indireção Múltipla Aritmética de podem apontar para outros ponteiros. Cada * adiciona um novo nível de indireção. 1 i n t n = 4 2 ; 2 i n t p = &n ; 3 i n t pp = &p ;
Substring Crie um programa que imprima todos os caracteres digitados, exceto vogais minúsculas.
Resposta 1 #i n c l u d e <s t d i o. h> 2 #i n c l u d e < s t r i n g. h> 3 i n t main ( ) { 4 i n t i =0; 5 char s t r [ 5 0 ] = "" ; 6 p r i n t f ( " S t r i n g : " ) ; 7 g e t s ( s t r ) ; 8 while ( s t r [ i ]!= ' \0 ' ) { 9 i f ( ( s t r [ i ]!= ' a ' ) && ( s t r [ i ]!= ' e ' ) && 10 ( s t r [ i ]!= ' i ' ) && ( s t r [ i ]!= ' o ' ) && 11 ( s t r [ i ]!= ' u ' ) ) 12 p r i n t f ( " %c ", s t r [ i ] ) ; 13 i ++; 14 } 15 r e t u r n ( 0 ) ; 16 }
Inverter vetor espertinho Faça um programa que imprime um vetor com número xo de inteiros de modo invertido, PORÉM sem utilizar o operador de índices"[]". (Se achar muito difícil, pode fazer com índices primeiro e depois passar para solução com ponteiros.)
Resposta 1 #i n c l u d e <s t d i o. h> 2 #d e f i n e N_ELEM 10 3 i n t main ( ) { 4 i n t i =0, n, v [N_ELEM ] ; 5 f o r ( i =0; i <N_ELEM; i ++) { 6 p r i n t f ( "\ nelemento %d : ", i ) ; 7 s c a n f ( "%d",&n ) ; 8 ( v+i ) = n ; 9 } 10 f o r ( i=n_elem; i >=0; i ) 11 p r i n t f ( "%d", ( v+i ) ) ; 12 r e t u r n ( 0 ) ; 13 }
Dúvidas, Sugestões, Críticas www.inf.ufrgs.br/pet pet@inf.ufrgs.br