Aula 3 - Linguagem C

Embed Size (px)

DESCRIPTION

Aula sobre a linguagem C

Citation preview

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros

    Marcio Moretto [email protected]

    Escola de Artes Ciencias e HumanidadesUSP

    19 de Marco de 2013

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Slides

    Slides disponveis em:https://www.dropbox.com/sh/nca1h0iu8doc41p/PDgUeYiVIe

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Resumo da aula

    Enderecos e ponteiros. Arrays e aritmetica com enderecos. Strings. Matrizes. Arrays de ponteiros (argc e argv).

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Resumo da aula

    Enderecos e ponteiros. Arrays e aritmetica com enderecos. Strings. Matrizes. Arrays de ponteiros (argc e argv).

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Resumo da aula

    Enderecos e ponteiros. Arrays e aritmetica com enderecos. Strings. Matrizes. Arrays de ponteiros (argc e argv).

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Resumo da aula

    Enderecos e ponteiros. Arrays e aritmetica com enderecos. Strings. Matrizes. Arrays de ponteiros (argc e argv).

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Resumo da aula

    Enderecos e ponteiros. Arrays e aritmetica com enderecos. Strings. Matrizes. Arrays de ponteiros (argc e argv).

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Endereco de uma variavel

    1 int a;

    Quando declaramos uma variavel, e reservado um espaco dememoria de tamanho adequado (tamanho de um inteiro nestecaso).As vezes e util saber o endereco desse espaco de memoria. Em Cacessamos esse valor usando o smbolo & antes do nome davariavel.

    1 &a; /* endereco de a */

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Endereco de uma variavel

    1 int a;

    Quando declaramos uma variavel, e reservado um espaco dememoria de tamanho adequado (tamanho de um inteiro nestecaso).As vezes e util saber o endereco desse espaco de memoria. Em Cacessamos esse valor usando o smbolo & antes do nome davariavel.

    1 &a; /* endereco de a */

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros

    Pergunta: Qual e o tipo de &a?

    1 int a;

    2 int b = &a;

    > gcc ponteiros.c

    ponteiros.c: Na func~ao main:

    ponteiros.c:7:5: warning: assignment makes

    integer from pointer without a cast [habilitado por

    padr~ao]

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros

    Pergunta: Qual e o tipo de &a?

    1 int a;

    2 int b = &a;

    > gcc ponteiros.c

    ponteiros.c: Na func~ao main:

    ponteiros.c:7:5: warning: assignment makes

    integer from pointer without a cast [habilitado por

    padr~ao]

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros

    Pergunta: Qual e o tipo de &a?

    1 int a;

    2 printf("%d\n", &a);

    > gcc ponteiros.c

    ponteiros.c: Na func~ao main:

    ponteiros.c:7:3: warning: format %d espera

    argumento do tipo int, porem o argumento 2 possui

    tipo int * [-Wformat]

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros

    Pergunta: Qual e o tipo de &a?

    1 int a;

    2 printf("%d\n", &a);

    > gcc ponteiros.c

    ponteiros.c: Na func~ao main:

    ponteiros.c:7:3: warning: format %d espera

    argumento do tipo int, porem o argumento 2 possui

    tipo int * [-Wformat]

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros

    1 int a;

    2 int *b;

    3 b = &a;

    b e um ponteiro para int que aponta para a variavel a.

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros

    1 int a;

    2 int *b;

    3 b = &a;

    b e um ponteiro para int que aponta para a variavel a.

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros

    1 int a;

    2 int *b;

    3 b = &a;

    4 *b = 4;

    5 printf("%d\n", *b);

    6 printf("%d\n", a);

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros

    1 int a;

    2 int *b;

    3 b = &a;

    4 *b = 4;

    5 printf("%d\n", *b);

    6 printf("%d\n", a);

    A linha 5 altera o conteudo do local apontado por b.

    > a.out

    4

    4

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros

    1 int a;

    2 int *b;

    3 b = &a;

    4 *b = 4;

    5 printf("%d\n", *b);

    6 printf("%d\n", a);

    A linha 5 altera o conteudo do local apontado por b.

    > a.out

    4

    4

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros

    1 int a = 42;

    2 printf("%d\n", *&a);

    > a.out

    42

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros

    1 int a = 42;

    2 printf("%d\n", *&a);

    > a.out

    42

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros

    1 int a;

    2 printf("%p\n", &a);

    > gcc ponteiros.c

    > a.out

    0x7fff01e090fc

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros

    1 int a;

    2 printf("%p\n", &a);

    > gcc ponteiros.c

    > a.out

    0x7fff01e090fc

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    printf (cont.)

    %c caracteres (char).%d inteiros decimais com sinal (int).%u inteiros decimais sem sinal (unsigned int).%ld inteiros longos (long).%f numeros com ponto flutuante (float).%lf numeros com ponto flutuante de dupla precisao (double).%p ponteiros (int*, double*, float* etc.).%x inteiros em hexadecimal.%s string.%% imprime o sbolo %

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros e Argumentos de Funcoes

    1 void troca(int x, int y){

    2 int tmp = x;

    3 x = y;

    4 y = tmp;

    5 }

    6 main (){

    7 int n = 4;

    8 int m = 5;

    9 troca(n,m);

    10 printf("n=%d m=%d\n", n, m);

    11 }

    n=4 m=5

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros e Argumentos de Funcoes

    1 void troca(int x, int y){

    2 int tmp = x;

    3 x = y;

    4 y = tmp;

    5 }

    6 main (){

    7 int n = 4;

    8 int m = 5;

    9 troca(n,m);

    10 printf("n=%d m=%d\n", n, m);

    11 }

    n=4 m=5

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros e Argumentos de Funcoes

    1 void troca(int *x, int *y){

    2 int tmp = *x;

    3 *x = *y;

    4 *y = tmp;

    5 }

    6 main (){

    7 int n = 4;

    8 int m = 5;

    9 troca (&n,&m);

    10 printf("n=%d m=%d\n", n, m);

    11 }

    n=5 m=4

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros e Argumentos de Funcoes

    1 void troca(int *x, int *y){

    2 int tmp = *x;

    3 *x = *y;

    4 *y = tmp;

    5 }

    6 main (){

    7 int n = 4;

    8 int m = 5;

    9 troca (&n,&m);

    10 printf("n=%d m=%d\n", n, m);

    11 }

    n=5 m=4

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros e Argumentos de Funcoes

    1 void troca(int *x, int *y){

    2 int tmp = *x;

    3 *x = *y;

    4 *y = tmp;

    5 }

    6 main (){

    7 int n = 4;

    8 int m = 5;

    9 troca (&n,&m);

    10 printf("n=%d m=%d\n", n, m);

    11 }

    n=5 m=4

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros e Argumentos de Funcoes

    1 void troca(int *x, int *y){

    2 int tmp = *x;

    3 *x = *y;

    4 *y = tmp;

    5 }

    6 main (){

    7 int n = 4;

    8 int m = 5;

    9 troca (&n,&m);

    10 printf("n=%d m=%d\n", n, m);

    11 }

    n=5 m=4

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Ponteiros e Argumentos de Funcoes

    Exerccio 1: Escreva uma funcao que receba os coeficientes deuma equacao de segundo grau e calcula suas raizes.

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays (vetores)

    1 #define MAX 3

    2 main (){

    3 int i;

    4 int a[MAX];

    5 a[0] = 1; a[1] = 4; a[2] = 2;

    6

    7 for(i = 0; i < 3; i++)

    8 printf("%d\n", a[i]);

    9 }

    1

    4

    2

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays (vetores)

    1 #define MAX 3

    2 main (){

    3 int i;

    4 int a[MAX];

    5 a[0] = 1; a[1] = 4; a[2] = 2;

    6

    7 for(i = 0; i < 3; i++)

    8 printf("%d\n", a[i]);

    9 }

    1

    4

    2

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays (vetores)

    1 main (){

    2 int i;

    3 int a[] = {1,4,2};

    4

    5 for(i = 0; i < 3; i++)

    6 printf("%d\n", a[i]);

    7 }

    1

    4

    2

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays (vetores)

    1 main (){

    2 int i;

    3 int a[] = {1,4,2};

    4

    5 for(i = 0; i < 3; i++)

    6 printf("%d\n", a[i]);

    7 }

    1

    4

    2

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays

    Quando declaramos um array de inteiros de tamanho MAX(int a[MAX]), e reservada uma porcao contgua da memoriade MAX vezes o tamanho de um int.

    Quando declaramos int a[] = {1,4,2}, e reservado umespaco suficiente para inicializar o array com os valores entrechaves (no caso 3 vezes o tamanho de um int).

    Para acessar (alterar) o i-esimo valor desse array usamos asintaxe (a[i]).

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays

    Quando declaramos um array de inteiros de tamanho MAX(int a[MAX]), e reservada uma porcao contgua da memoriade MAX vezes o tamanho de um int.

    Quando declaramos int a[] = {1,4,2}, e reservado umespaco suficiente para inicializar o array com os valores entrechaves (no caso 3 vezes o tamanho de um int).

    Para acessar (alterar) o i-esimo valor desse array usamos asintaxe (a[i]).

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays

    Quando declaramos um array de inteiros de tamanho MAX(int a[MAX]), e reservada uma porcao contgua da memoriade MAX vezes o tamanho de um int.

    Quando declaramos int a[] = {1,4,2}, e reservado umespaco suficiente para inicializar o array com os valores entrechaves (no caso 3 vezes o tamanho de um int).

    Para acessar (alterar) o i-esimo valor desse array usamos asintaxe (a[i]).

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays e ponteiros

    1 int a[10];

    2 int *pa;

    3 pa = &a[0];

    pa aponta para a[0].

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays e ponteiros

    O que significa a seguinte expressao?

    1 *(pa + 1);

    pa + 1 e o endereco do proximo inteiro i.e. pa + 1 e o enderecode a[1].

    De forma mais geral, pa + i e o endereco de a[i].

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays e ponteiros

    O que significa a seguinte expressao?

    1 *(pa + 1);

    pa + 1 e o endereco do proximo inteiro i.e. pa + 1 e o enderecode a[1].

    De forma mais geral, pa + i e o endereco de a[i].

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays e ponteiros

    O que significa a seguinte expressao?

    1 *(pa + 1);

    pa + 1 e o endereco do proximo inteiro i.e. pa + 1 e o enderecode a[1].

    De forma mais geral, pa + i e o endereco de a[i].

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays e ponteiros

    O que significa a seguinte expressao?

    1 *(pa + 1);

    pa + 1 e o endereco do proximo inteiro i.e. pa + 1 e o enderecode a[1].

    De forma mais geral, pa + i e o endereco de a[i].

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays e ponteiros

    Note que em C o nome do array indica seu endereco inicial i.e.quando declaramos int a[MAX] temos que a e o mesmo que&a[0].

    Logo, a expressao a[i] nada mais e do que uma abreviacao para*(a + i).

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays e ponteiros

    Note que em C o nome do array indica seu endereco inicial i.e.quando declaramos int a[MAX] temos que a e o mesmo que&a[0].

    Logo, a expressao a[i] nada mais e do que uma abreviacao para*(a + i).

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Aritimetica com Enderecos

    Adicao: como ja vimos, se pa e um ponteiro para int, pa +i e o endereco do i-esimo inteiro depois de pa.

    Comparacao: se p e q apontam para membros de um vetorentao podemos comparar qual vem antes ou depois no vetorusando os smbolos , =, == e !=.

    Subtracao: se p e q apontam para membros de um vetorentao podemos subtra-los para saber a distancia entre eles.

    1 int a[10];

    2 printf("%ld\n", &a[8] - &a[3]);

    5

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Aritimetica com Enderecos

    Adicao: como ja vimos, se pa e um ponteiro para int, pa +i e o endereco do i-esimo inteiro depois de pa.

    Comparacao: se p e q apontam para membros de um vetorentao podemos comparar qual vem antes ou depois no vetorusando os smbolos , =, == e !=.

    Subtracao: se p e q apontam para membros de um vetorentao podemos subtra-los para saber a distancia entre eles.

    1 int a[10];

    2 printf("%ld\n", &a[8] - &a[3]);

    5

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Aritimetica com Enderecos

    Adicao: como ja vimos, se pa e um ponteiro para int, pa +i e o endereco do i-esimo inteiro depois de pa.

    Comparacao: se p e q apontam para membros de um vetorentao podemos comparar qual vem antes ou depois no vetorusando os smbolos , =, == e !=.

    Subtracao: se p e q apontam para membros de um vetorentao podemos subtra-los para saber a distancia entre eles.

    1 int a[10];

    2 printf("%ld\n", &a[8] - &a[3]);

    5

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Aritimetica com Enderecos

    Adicao: como ja vimos, se pa e um ponteiro para int, pa +i e o endereco do i-esimo inteiro depois de pa.

    Comparacao: se p e q apontam para membros de um vetorentao podemos comparar qual vem antes ou depois no vetorusando os smbolos , =, == e !=.

    Subtracao: se p e q apontam para membros de um vetorentao podemos subtra-los para saber a distancia entre eles.

    1 int a[10];

    2 printf("%ld\n", &a[8] - &a[3]);

    5

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Aritimetica com Enderecos

    Adicao: como ja vimos, se pa e um ponteiro para int, pa +i e o endereco do i-esimo inteiro depois de pa.

    Comparacao: se p e q apontam para membros de um vetorentao podemos comparar qual vem antes ou depois no vetorusando os smbolos , =, == e !=.

    Subtracao: se p e q apontam para membros de um vetorentao podemos subtra-los para saber a distancia entre eles.

    1 int a[10];

    2 printf("%ld\n", &a[8] - &a[3]);

    5

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Strings

    Uma cadeia de caracteres da forma "Ola C!" e um array decaracteres (char) terminada por um caracter nulo (\0).

    1 int i;

    2 char* a = "java";

    3

    4 for(i = 0; a[i] != \0; i++)

    5 printf("%c", a[i]);

    6 printf("\n");

    java

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Strings

    Uma cadeia de caracteres da forma "Ola C!" e um array decaracteres (char) terminada por um caracter nulo (\0).

    1 int i;

    2 char* a = "java";

    3

    4 for(i = 0; a[i] != \0; i++)

    5 printf("%c", a[i]);

    6 printf("\n");

    java

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Strings

    Uma cadeia de caracteres da forma "Ola C!" e um array decaracteres (char) terminada por um caracter nulo (\0).

    1 int i;

    2 char a[] = "java";

    3

    4 for(i = 0; a[i] != \0; i++)

    5 printf("%c", a[i]);

    6 printf("\n");

    java

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Strings

    Na segunda versao, a e um array de caracteres de tamanho 5.

    1 char a[] = "java";

    2

    3 a[2] = c;

    4 printf("%s\n", a);

    jaca

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Strings

    Na primeira versao, a e um ponteiro para a cadeia constante decaracteres.

    1 char* a = "java";

    2

    3 a[2] = c;

    4 printf("%s\n", a);

    Falha de segmentac~ao (imagem do nucleo gravada)

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    strcpy

    strcpy(t,s) e uma funcao da biblioteca string.h que copiauma cadeia de caracteres s em uma cadeia de caracteres t:

    1 #include

    2 #include

    3 #define MAX 20

    4 main (){

    5 char a[] = "java";

    6 char b[MAX];

    7 strcpy(b, a);

    8 printf("%s\n%s\n", a, b);

    9 }

    java

    java

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    strcpy

    strcpy(t,s) e uma funcao da biblioteca string.h que copiauma cadeia de caracteres s em uma cadeia de caracteres t:

    1 #include

    2 #include

    3 #define MAX 20

    4 main (){

    5 char a[] = "java";

    6 char b[MAX];

    7 strcpy(b, a);

    8 printf("%s\n%s\n", a, b);

    9 }

    java

    java

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    strcpy (versao 1)

    Implementacao do strcpy usando arrays.

    1 void strcpy(char *s, char *t){

    2 int i = 0;

    3

    4 while ((s[i] = t[i]) != \0)

    5 i++;

    6 }

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    strcpy (versao 2)

    Versao com ponteiros no lugar do array.

    1 void strcpy(char *s, char *t){

    2 while ((*s = *t) != \0){

    3 s++;

    4 t++;

    5 }

    6 }

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    strcpy (versao 3)

    O operador *s++ primeiro retorna o valor de *s e depoisincrementa.

    1 void strcpy(char *s, char *t){

    2 while ((*s++ = *t++) != \0);

    3 }

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    strcpy (versao 4)

    O smbolo \0 e o caracter nulo.1 void strcpy(char *s, char *t){

    2 while (*s++ = *t++);

    3 }

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    strcmp

    strcmp(s,t) e uma funcao da biblioteca string.h que comparaduas strings s e t.

    strcmp(s,t) retorna 0 se t for igual a s. strcmp(s,t) retorna um inteiro negativo se s vier antes de t

    na ordem alfabetica.

    strcmp(s,t) retorna um inteiro positivo se s vier depois de tna ordem alfabetica.

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    strcmp

    1 #include

    2 #include

    3 main (){

    4 char *a = "java"; char *b = "jaca";

    5 if (strcmp(a,b) < 0) /* a < b*/

    6 printf("%s\t%s\n", a, b);

    7 else if (! strcmp(a,b)) /* a = b */

    8 printf("%s\n", a);

    9 else /* a > b */

    10 printf("%s\t%s\n", b, a);

    11 }

    jaca java

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    strcmp

    1 #include

    2 #include

    3 main (){

    4 char *a = "java"; char *b = "jaca";

    5 if (strcmp(a,b) < 0) /* a < b*/

    6 printf("%s\t%s\n", a, b);

    7 else if (! strcmp(a,b)) /* a = b */

    8 printf("%s\n", a);

    9 else /* a > b */

    10 printf("%s\t%s\n", b, a);

    11 }

    jaca java

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    strcmp (versao 1)

    Implementacao de strcmp usando arrays:

    1 int strcmp(char *s, char *t){

    2 int i;

    3 for (i = 0; s[i] == t[i]; i++)

    4 if (s[i] == \0)

    5 return 0;

    6 return s[i] - t[i];

    7 }

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    strcmp (versao 2)

    Versao de strcmp usando ponteiros.

    1 int strcmp(char *s, char *t){

    2 for (; *s == *t; s++, t++)

    3 if (*s == \0)

    4 return 0;

    5 return *s - *t;

    6 }

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Matrizes

    Matrizes nada mais sao do que arrays bidimensionais.

    1 main (){

    2 int l, c; int a[2][3];

    3 a[0][0] = 1; a[0][1] = 4; a[0][2] = 2;

    4 a[1][0] = 4; a[1][1] = 2; a[1][2] = 1;

    5 for(l = 0; l < 2; l++){

    6 for(c = 0; c < 3; c++)

    7 printf("%d ", a[l][c]);

    8 printf("\n");

    9 }

    10 }

    1 4 2

    4 2 1

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Matrizes

    Matrizes nada mais sao do que arrays bidimensionais.

    1 main (){

    2 int l, c; int a[2][3];

    3 a[0][0] = 1; a[0][1] = 4; a[0][2] = 2;

    4 a[1][0] = 4; a[1][1] = 2; a[1][2] = 1;

    5 for(l = 0; l < 2; l++){

    6 for(c = 0; c < 3; c++)

    7 printf("%d ", a[l][c]);

    8 printf("\n");

    9 }

    10 }

    1 4 2

    4 2 1

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Matrizes

    A declarcao int a[2][3] reserva um espaco de memoria detamanho 2 3 vezes o tamanho de um int.

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Matrizes

    A declarcao int a[2][3] reserva um espaco de memoria detamanho 2 3 vezes o tamanho de um int.

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays de Ponteiros

    1 int *a[6];

    A declaracao acima reserva um array com seis ponteiros para int.

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays de Ponteiros

    1 int *a[6];

    A declaracao acima reserva um array com seis ponteiros para int.

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    argc e argv

    argc e argv sao parametros que podem ser passados para afuncao main.

    argc contem o numero de parametros passados na linha decomando (o proprio nome do comando aqui e considerado umparametro).

    argv e um array de ponteiros de tamanho (argc) que apontapara strings contendo os parametros.

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    argc e argv

    argc e argv sao parametros que podem ser passados para afuncao main.

    argc contem o numero de parametros passados na linha decomando (o proprio nome do comando aqui e considerado umparametro).

    argv e um array de ponteiros de tamanho (argc) que apontapara strings contendo os parametros.

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    argc e argv

    argc e argv sao parametros que podem ser passados para afuncao main.

    argc contem o numero de parametros passados na linha decomando (o proprio nome do comando aqui e considerado umparametro).

    argv e um array de ponteiros de tamanho (argc) que apontapara strings contendo os parametros.

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    argc e argv

    1 main(int argc , char* argv []){

    2 printf("%d\n", argc);

    3 printf("%s\n", argv [0]);

    4 printf("%s\n", argv [1]);

    5 }

    > a.out 42

    a.out

    42

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    argc e argv

    1 main(int argc , char* argv []){

    2 printf("%d\n", argc);

    3 printf("%s\n", argv [0]);

    4 printf("%s\n", argv [1]);

    5 }

    > a.out 42

    a.out

    42

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    echo

    echo e um programa que imprime (ecoa) seus argumentos:

    > echo 42 4 2

    42 4 2

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    echo

    echo e um programa que imprime (ecoa) seus argumentos:

    > echo 42 4 2

    42 4 2

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    echo

    1 main(int argc , char* argv []){

    2 int i;

    3 for(i = 1; i < argc; i++){

    4 printf("%s", argv[i]);

    5 if (i < argc - 1)

    6 printf(" ");

    7 }

    8 printf("\n");

    9 }

    > a.out 42 4 2

    a.out

    42 4 2

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    echo

    1 main(int argc , char* argv []){

    2 int i;

    3 for(i = 1; i < argc; i++){

    4 printf("%s", argv[i]);

    5 if (i < argc - 1)

    6 printf(" ");

    7 }

    8 printf("\n");

    9 }

    > a.out 42 4 2

    a.out

    42 4 2

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    echo (versao 2)

    1 main(int argc , char* argv []){

    2 while(--argc > 0)

    3 printf ((argc > 1) ? "%s " : "%s", *++ argv);

    4 printf("\n");

    5 }

    > a.out 42 4 2

    a.out

    42 4 2

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    echo (versao 2)

    1 main(int argc , char* argv []){

    2 while(--argc > 0)

    3 printf ((argc > 1) ? "%s " : "%s", *++ argv);

    4 printf("\n");

    5 }

    > a.out 42 4 2

    a.out

    42 4 2

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays de Ponteiros vs Matrizes

    1 char *mes[] = {"jan", "fev", "mar", "abr", "mai", "jun",

    2 "jul", "ago", "set", "out", "nov", "dez"};

    A declaracao acima inicializa um array de ponteiros para strings.

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Arrays de Ponteiros vs Matrizes

    1 char mes [][3] = {"jan", "fev", "mar", "abr", "mai", "jun",

    2 "jul", "ago", "set", "out", "nov", "dez"};

    A declaracao acima inicializa uma matriz de chars de tamanho 4.

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Jogo da velha

    Exerccio 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!

    Marcio M. Ribeiro EACH

    Aula 3

  • Enderecos e Ponteiros Arrays e aritmetica com enderecos Strings Matrizes Arrays de Ponteiros

    Proxima Aula

    Estruturas (struct) e alocacao dinamica.

    Marcio M. Ribeiro EACH

    Aula 3

    Endereos e PonteirosArrays e aritmtica com endereosStringsMatrizesArrays de Ponteiros