ELC1065 - Laboratório de Programação I
Primeiro Semestre de 2013
Professora: Juliana Kaizer Vizzotto
Ponteiros em C
- Os ponteiros são variáveis cujos valores são endereços de memória.
- 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.
- Declarando e Inicializando
- 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`
. - 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`
. - 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. - 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
- Existem duas maneiras de passar argumentos a uma função, denominadas chamada por valor e chamadas por referência.
- 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. - Em C, você usa ponteiros e operadores de indireção ara simular uma chamada por referência.
- 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. - É 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]`
. - 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.
- 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){ ... }