AULA 03 - Gerenciamento de Memória em C++ - Ponteiros 1 Ponteiros - Introdução Variáveis cujos valores são endereços de memória. Sintaxe de declaração de ponteiros: tipo_da_variavel * nome_ponteiro; Exemplo: int * p_int ; // declara a variável p_int como um ponteiro para inteiros Sintaxe de atribuição de valores para variáveis ponteiros: nome_ponteiro = &nome_da_variavel ; Sintaxe de leitura do conteúdo da variável indica por um ponteiro: *ponteiro = nome_da_variavel ; Exemplo: int * p_int , v_int; // declara p_int : ponteiro para inteiros e v_int: inteiro v_int = 5; // atribui o valor 5 para v_int; p_int = &v_int; // atribui o endereço de v_int a p_int cout << v_int; // imprime o valor de v_int (5) cout << *p_int; // imprime o conteúdo da variável cujo endereço está // armazenado em p_int cout << &p_int; // imprime o endereço do ponteiro p_int Ponteiros ainda não inicializados possibilitam o acesso à endereços ocupados por outros dados. Na declaração de um ponteiro, utilize a palavra reservada NULL para indicar que ele não aponta para nenhum endereço. float * p_float = NULL; 2 Ponteiros e Matrizes A criação de uma matriz cria implicitamente um ponteiro com o mesmo nome da matriz e que aponta sempre para o endereço da primeira célula da matriz - ponteiro constante. Exemplo: char palavra [15]; // declara a string palavra[15] e cria o ponteiro constante // palavra que contém o endereço de palavra[0] strcpy(palavra,"Objetos"); // strcpy copia a string objetos no endereço //apontado pelo ponteiro palavra // palavra=NULL // Erro: palavra é um ponteiro constante 3 Ponteiros e Estruturas tipo_estrutura * ponteiro; ponteiro->membro_estrutura; // declaração de ponteiro para estrutura (*ponteiro).membro_estrutura; // acesso aos membros de uma estrutura // pelo ponteiro 1 4 Ponteiros para uma constante Apontadores cujo conteúdo é imutável Exemplo: int main( ) { const int x=1,y=2; // x e y são constantes const int* pint=&x; cout << *pint << endl; *pint=3; // cannot modify a const object int* pnormal; pnormal=&y; // Cannot convert 'const int *' to 'int *'. // não permite atribuir um ponteiro normal para constante int z=10; // z não é constante pint=&z; *pint=5; //cannot modify a const object // não permite alterar o conteudo variável apontada ainda que esta // não seja const. embora se possa altera-la diretamente z=12; cout << *pint << endl; const char* string = "Eu sou uma constante !"; cout << string << endl; *string="Hi World!"; // cannot modify a const object string="Hi World!"; cout << string << endl; getch(); return 0; } 5 Ponteiros constantes Apontadores que não mudam o endereço apontado Exemplo: int z=1,w=2; int* const ptint=&z; // atente para a sintaxe cout << *ptint << endl; ptint=&w; // cannot modify a const object *ptint=3; cout << *ptint << endl; char* const pstring = "Eu sou uma constante !"; cout << pstring << endl; pstring=string; // cannot modify a const object // pstring="Hi World!"; // cannot modify a const object cout << pstring << endl; 2 6 Ponteiro constante para uma constante const char* const msg = "Eu e meu ponteiro somos constantes" Exemplo: // ponteiro constante para constante const int i=1, j=2; const int * const pccint = & i ; cout << *pccint << endl; // imprime 1 *pccint=3; // cannot modify a const object pccint=&j; // cannot modify a const object char* mystr="Mensagem"; const char* const pccstr = "Eu sou uma constante !"; cout << pccstr << endl; pccstr="Hi World!"; // cannot modify a const object *mystr="Hi World!"; // cannot modify a const object pccstr=mystr; // cannot modify a const object 3