Sie sind auf Seite 1von 20

Linguagem C

Ponteiros

Alex Vidigal Bastos


alexvbh@gmail.com

Ponteiros
Ponteiros so variveis que contm endereos. Estas variveis apontam para algum determinado endereo da memria. Em geral, o ponteiro aponta para o endereo de alguma varivel declarada no programa. Para acessar o contedo de um ponteiro usamos: *nome_do_ponteiro O operador * determina o contedo de um endereo. A um ponteiro pode ser atribudo o valor nulo (constante NULL da biblioteca stdlib.h) Um ponteiro com valor NULL no aponta para lugar nenhum.

Declarao de Ponteiros
Utiliza-se se o operador unrio *
int *ap_int; char *ap_char; float *ap_float; double *ap_double; int *ap1, *ap_2, *ap_3; int *ap1, int1, int2;

Exemplo
#include <stdio.h> int main() { int x = 5; int *px; px = &x; printf("x: %d\n" n", x); printf("px: %d\ \n", *px); return 0; }

Exemplo
#include <stdio.h> int main() { int x = 5; int *px; px = &x; printf("x: %d\n", x); printf("px: %d\n", , *px); x = 7; printf("x: %d\n", x); printf("px: %d\n", , *px); *px = 3; printf("x: %d\n", x); printf("px: %d\n", , *px); return 0; }

Ponteiro para char


#include <stdio.h> int strtamanho(char *str) { int tamanho = 0; while (*str) { tamanho++; str++; } return tamanho; } int main() { char palavra[100]; printf("Digite "Digite uma palavra: "); " gets(palavra); printf("O tamanho e: %d\ \n", strtamanho(palavra)); return 0; }

Ponteiro para char


#include <stdio.h> char *strupper(char *str) { char *inicio; inicio = str; while (*str) { *str = toupper(*str); str++; } return inicio; } int main() { char palavra[100]; printf("Digite "Digite uma palavra: "); " gets(palavra); printf("Em "Em caixa alta: %s\n", %s strupper(palavra)); return 0; }

Alocao Dinmica
Usada sempre que no se sabe exatamente quanto de memria ser usado para uma determinada tarefa. Assim, reserva-se se espao da memria disponvel (HEAP) medida que mais memria torna-se torna necessria. Tambm pode-se se liberar posies de memria quando no forem mais necessrias. A memria alocada no no incio do programa, mas sim no decorrer de sua utilizao do sistema. como se pudssemos definir um ARRAY com o seu tamanho sendo alterado medida que fosse necessrio.

Alocao dinmica de memria


A alocao dinmica de memria realizada atravs da funo malloc()
Ela aloca um bloco consecutivo de bytes na memria e retorna o endereo deste bloco. Prottipo:
void *malloc (unsigned int num);

Recebe o nmero de bytes que queremos alocar e retorna um ponteiro para o primeiro byte alocado. Se no houver memria suficiente, retorna um ponteiro nulo (NULL).

Alocao dinmica de memria


Funo sizeof()
til para saber o tamanho de um tipo.

calloc
Semelhante a malloc, mas com prottipo um pouco diferente:
void *calloc (unsigned int num, unsigned int size);

Aloca uma quantidade de memria igual a num * size.

Alocao dinmica de memria


realloc
Prottipo:
void *realloc (void *ptr, unsigned int num);

Modifica o tamanho da memria previamente alocada apontada por *ptr para aquele especificado por num. O valor de num pode ser maior ou menor que o original. Se no houver memria suficiente para a alocao, um ponteiro nulo devolvido e o bloco original deixado inalterado.

Liberao dinmica de memria


A liberao dinmica de memria realizada atravs da funo free()
Ela libera o uso de um bloco de memria.

Ponteiros para estruturas


#include <stdio.h> #include <string.h> #include <stdlib.h> struct pessoa { char nome[50]; int idade; }; typedef struct pessoa Pessoa; Pessoa int main() { Pessoa *p = malloc(sizeof(Pessoa)); strcpy(p->nome,"Regis"); p->idade = 18; printf("Nome: %s - Idade: %d\n", %d p->nome, p->idade); free(p); return 0; }

Exemplo
#include <stdio.h> #include <string.h> #include <stdlib.h> struct pessoa { char nome[50]; int idade; }; typedef struct pessoa Pessoa; int main() { Pessoa *p = malloc(2 * sizeof(Pessoa)); Pessoa *inicio = p; strcpy(p->nome,"Regis"); p->idade = 18; p++; strcpy(p->nome,"Maria"); p->idade = 25; p = inicio; printf("Nome: %s - Idade: %d\n", p->nome nome, p->idade); p++; printf("Nome: %s - Idade: %d\n", p->nome nome, p->idade); free(inicio); return 0; }

Exemplo
#include <stdio.h> #include <string.h> #include <stdlib.h> struct pessoa { char nome[50]; int idade; }; typedef struct pessoa Pessoa; int main() { Pessoa *p = malloc(2 * sizeof(Pessoa Pessoa)); strcpy(p[0].nome,"Regis"); p[0].idade = 18; strcpy(p[1].nome,"Maria"); p[1].idade = 25; printf("Nome: %s - Idade: %d\n" n", p[0].nome, p[0].idade); printf("Nome: %s - Idade: %d\n" n", p[1].nome, p[1].idade); free(p); return 0; }

Passagem parmetros por referncia


A passagem de parmetros por referncia em C requer o uso de ponteiros.

Passagem parmetros por referncia


#include <stdio.h> void troca(int *x, int *y) { int aux = *x; *x = *y; *y = aux; } int main() { int n1, n2; printf("Digite n1: "); scanf("%d", &n1); printf("Digite n2: "); scanf("%d", &n2); troca(&n1, &n2); printf("n1 eh: %d\n", , n1); printf("n2 eh: %d\n", , n2); return 0; }

Lista Encadeada Simples

Lista Encadeada Simples

Lista Encadeada Simples


#include <stdio.h> #include <stdlib.h> typedef struct pessoa Pessoa; struct pessoa { char nome[50]; int idade; Pessoa *proximo; }; int main() { Pessoa *pAtual, *pInicio = NULL, *pAnterior = NULL; char continua; do { pAtual = malloc(sizeof(Pessoa)); printf("Digite um nome: "); gets(pAtual->nome); printf("Digite a idade: "); scanf("%d", &pAtual->idade); getchar(); if (pInicio == NULL) { pInicio = pAtual; } if (pAnterior != NULL) { pAnterior->proximo = pAtual; } pAnterior = pAtual; printf("Insere mais (S/N)? "); continua = getchar(); getchar(); } while (toupper(continua) != 'N'); pAtual = pInicio; while (pAtual != NULL) { printf("Nome: %s - Idade: %d\n", pAtual->nome, , pAtual->idade); pAtual pAtual = pAtual->proximo; } }

Das könnte Ihnen auch gefallen