UFSM > Ciência da Computação

Primeiro Semestre de 2013
Professora: Juliana Kaizer Vizzotto

Ponteiros em C

  1. Os ponteiros são variáveis cujos valores são endereços de memória.

  2. Normalmente, uma variável claramente contém um valor específico. Um ponteiro, por outro lado, contém um endereço de uma variável que contém um valor específico.
  1. Declarando e Inicializando

  2. A seguinte declaração:

     int *countPtr, count;
    

    especifica que a variável `countPtr` é do tipo `int*`, ou seja, um ponteiro para um inteiro. Além disso, a variável `count` é definida para ser um `int` , e não um ponteiro para um `int`.

  3. A seguir, vamos utilizar o operador de endereço `&`, que é um operador unário, que retorna o endereço de seu operando. Por exemplo, a declaração:

    count = 7;
    countPtr=&count;
    

    atribui o endereço da variável `count` à variável `countPtr`.

  4. O operador unário `*`, normalmente chamado de operador de indireção, retorna o valor do objeto apontado por seu operando. Por exemplo, a expressão:

    printf("%d",*countPtr);
    

    imprime o valor da variável `count`, i.e., 7.

  5. Exemplo de operadores com ponteiros `&` e `*`. O especificador de conversão `%p` mostra o local da memória como um inteiro hexadecimal

Passando Argumentos para Funções por Referência

  1. Existem duas maneiras de passar argumentos a uma função, denominadas chamada por valor e chamadas por referência.

  2. Todos os argumentos em C são passados por valor. Como já vimos, o `return` pode ser usado para retornar o valor de uma função para a chamadora. Entretanto, muitas funções exigem a capacidade de modificar uma ou mais variáveis na função chamadora ou passar um ponteiro para um objeto para evitar o overhead de passar o objeto por valor (lembre, na passagem por valor, uma cópia da variável/objeto é construída no espaço de memória da função). Para tratar dessas questões, C ofere a possibilidade de usarmos passagem por referência.

  3. Em C, você usa ponteiros e operadores de indireção ara simular uma chamada por referência.

  4. Ao chamar uma função com argumentos que devem ser modificados, os endereços dos argumentos devem ser passados. Isso normalmente é feito ao se aplicar o operador de endereço, `&`, à variável (na função chamadora), cujo valor será modificado.

  5. É importante lembrar que os arrays/vetores não são passados usando-se o operador de endereço, pois em C uma variável (constante) do tipo array já representa o endereço inicial da memória do array. Isto é, o nome do array é equivalente a `&nomeArray[0]`.

  6. DICA Use a chamada por valor para passar argumentos a uma função, a menos que a função chamadora (main, por exemplo) exija explicitamente que a função chamada modifique o valor da variável do argumento no ambiente da função chamadora.

  7. Convertendo uma String em maiúsculas usando um ponteiro não constante. Dado o seguinte protótipo, complete a função `convertToMaius` abaixo. Teste seu programa.

    #include <stdio.h>
    #include <ctype.h>
    void convertToMaius(char *sPtr);
    int main(void){
     char string[]="caracteres e R$32,98";
     printf("\n A string antes da conversao eh: %s",string);
     convertToMaius(string);
     printf("\n A string apos a conversao eh: %s",string);
     return 0;
    }
    void convertToMaius(char *sPtr){
     ...
    }
    

Página criada em: Quar Jul 10 15:00:00 BRT 2013. Última atualização em: Wed Jul 10 15:09:28 2013. Autoria: Juliana Kaizer Vizzotto.