·
Ciência da Computação ·
Introdução à Lógica e Programação
Envie sua pergunta para a IA e receba a resposta na hora
Recomendado para você
1
Verificação de Sorteio para Visto de Estágio
Introdução à Lógica e Programação
UFAL
7
Implementação de Busca Binária e Funções de Ordenação em C++
Introdução à Lógica e Programação
UFAL
10
Introdução às Strings em C++
Introdução à Lógica e Programação
UFAL
18
Conceitos sobre Vetores em Programação
Introdução à Lógica e Programação
UFAL
35
Introdução a Ponteiros e Arrays em C
Introdução à Lógica e Programação
UFAL
18
Introdução a Vetores em Programação
Introdução à Lógica e Programação
UFAL
33
Programa em C para Calcular Soma e Produto de Dois Números
Introdução à Lógica e Programação
UFAL
7
Estruturas de Dados: Pilhas, Filas e Listas em C
Introdução à Lógica e Programação
UFAL
1
Ordenação de Playlist Musical de Maria
Introdução à Lógica e Programação
UFAL
1
Programa para Multiplicação de Partes em Ragnarok Online
Introdução à Lógica e Programação
UFAL
Texto de pré-visualização
Ponteiros Toda variável tem um endereço ou uma posição associados na memória O endereço é visto como um ponteiro ou apontador É uma referência para a posição de memória de uma variável Ponteiros fornecem um modo de acesso à variável sem referenciála diretamente Um endereço pode ser armazenado em uma variável do tipo ponteiro ponteiro variável Ponteiro variável é uma variável que contém o endereço de outra variável o P aponta para V Valor 1 Endereço 4 Endereço 5 Endereço 4 Endereço 3 Endereço 2 Endereço 1 P V P endereço da variável V 3 Ponteiros 4 int p declara p tipo ponteiro para inteiro int v declara v tipo inteiro p v atribui o endereço de v ao ponteiro p ou seja apontase p para v int i j int ip i 12 ip i j ip ip 21 A variável ip armazena um ponteiro para um inteiro O endereço de i é armazenado em ip O conteúdo da posição apontada por ip é armazenado em j O conteúdo da posição apontada por ip passa a ser 21 Arrays 5 Ex float m10 pf pf m Referenciando Arrays 6 float m10 n10 float pf Em float m10 m é uma constante que endereça o primeiro elemento do array Portanto não é possível mudar o valor de m m n pf m erro m é constante ok Referenciando Elementos de Arrays 7 Podese referenciar os elementos de um array através de ponteiros float m 10 30 575 2345 float pf pf m2 cout pf 575 Referenciando Elementos de Arrays 8 Podese utilizar ponteiros e colchetes float m 10 30 575 2345 float pf pf m2 cout pf1 2345 Note que o valor entre colchetes é o deslocamento a ser considerado a partir do endereço de referencia pfn indica enésimo elemento a partir de pf Vamos ao código C Crie um programa C Parte I No programa principal defina um array vetor de 5 posições Inicialize os elementos desse vetor com a seguinte regra o vetori i 2 o Utilize a estrutura for Crie uma estrutura de repetição for para imprimir esses 5 elemento do vetor Teste o seu programa Parte II Crie uma função chamada initvetor para iniciar esse vetor o O código criado para inicializar o vetor deve ser movido para essa função Crie uma função chamada listvetor para listar os elementos desse vetor o O código criado para imprimir os elementos desse vetor deve ser movido para essa função Teste o seu programa Analise e reflita sobre as alterações 9 Vamos ao código C 10 include iostream using namespace std void initvetorfloat v int vsize for int i 0 i vsize i vi i 2 void listvetorfloat v int vsize for int i 0 i vsize i cout O elemento i do vetor e vi endl int main int n 5 float vetn cout o tamanho do vetor eh sizeofvet sizeofvet0 endl initvetorvet n listvetorvet n Ponteiros e Strings Strings são arrays de caracteres e podem ser acessadas usando char O incremento de pc o posiciona sobre o próximo caractere byte a byte 11 int main char str abcdef pc for pc str pc 0 pc cout pc Resultado abcdef Ponteiros e String Com base na função StrCopyC abaixo você deverá construir um programa em C com duas variáveis chamadas frase1 e frase2 A variável frase1 deverá conter uma frase qualquer e deverá ser copiada para a variável frase2 utilizando a função abaixo 12 void StrCopyCchar destino char origem while origem destino origem origem destino destino 0 Ponteiros e String 13 include iostream using namespace std void StrCopyCchar destino char origem a função tem como argumentos ponteiros while origem destino origem origem destino destino 0 indica final da string int main char frase150 Universidade Federal da Bahia frase250 StrCopyCfrase20 frase10 envia o primeiro endereço da string cout frase1 endl altere o programa para enviar o nésimo endereo de frase1 cout frase2 endl analise o resultado Exercício 20 Faça um programa que leia dois valores inteiros e chame uma função que receba estes 2 valores de entrada e retorne o maior valor na primeira variável e o menor valor na segunda variável Escreva o conteúdo das 2 variáveis na tela 14 Exercício 20 15 include iostream using namespace std void maiormenorint n1 int n2 int temp ifn1 n2 temp n1 n1 n2 n2 temp int main int num1 num2 cout Informe o primeiro numero endl cin num1 cout Informe o segundo numero endl cin num2 maiormenornum1 num2 cout O maior numero e num1 endl cout O segundo numero e num2 endl return 0 Contexto Errado Não sabemos o valor de N Funciona mas não é o mais indicado Faça um programa para cadastrar o preço de N produtos em que N é um valor informado pelo usuário Sempre que escrevemos um programa é preciso reservar espaço para as informações que serão processadas Para isso utilizamos as variáveis Uma variável é uma posição de memória que armazena uma informação que pode ser modificada pelo programa Ela deve ser definida antes de ser usada Quanto de memória um programa irá precisar Alocação Dinâmica Permite ao programador alocar memória para variáveis quando o programa está em execução e não apensa quando se está escrevendo o programa Quantidade de memória alocada sob demanda ou seja quando o programa precisa Menor desperdício de memória o Espaço é reservado até liberação explícita o Depois de liberado estará disponível para outros usos e não poderá mais ser acessado o Espaço alocado e não liberado explicitamente é automaticamente liberado ao final da execução Alocação de Memória Alocando 5 posições de memória em int p Memória posição variável conteúdo 119 120 121 int p NULL 122 123 124 125 126 127 128 Memória posição variável conteúdo 119 120 121 int p 123 122 123 p0 11 124 p1 25 125 p2 32 126 p3 44 127 p4 52 128 Alocação Dinâmica de Memória A linguagem C ANSI usa apenas 4 funções para o sistema de alocação dinâmica de memória malloc calloc realloc free Disponíveis stdlibh cstdlib Alocação Dinâmica de Memória malloc A função malloc serve para alocar memória e tem o seguinte protótipo void malloc unsigned int num Ou seja Dado um número de bytes que queremos alocar num Aloca na memória e retorna um ponteiro void para o primeiro byte alocada Se não houver memória suficiente para alocar a memória requisitada a função malloc retorna um ponteiro nulo NULL Alocação Dinâmica de Memória malloc O ponteiro void pode ser atribuído a qualquer tipo de ponteiro via type cast Se não houver memória suficiente para alocar a memória requisitada a função malloc retorna um ponteiro nulo Operador sizeof Operador em tempo de compilação que retorna o tamanho em bytes da variável ou especificador de tipo em parênteses que ele precede int float char Exemplo include iostream include stdlibh using namespace std struct ponto int x y int main cout char sizeofchar endl cout int sizeofint endl cout float sizeoffloat endl cout ponto sizeofponto endl return 0 Alocação Dinâmica de Memória malloc Alocar 1000 bytes de memória livre Alocar espaço para 50 inteiros cast Utilizado para forçar uma expressão a ser de um determinado tipo Formato tipo expressão int x 100 float f float x2 Exemplo usando malloc include iostream using namespace std include stdlibh Para usar malloc int main int p int a int i cin a p int malloc asizeofint Aloca a números inteiros if p ou p NULL cout Erro Memoria Insuficiente endl exit0 for i0 ia i p pode ser tratado como um vetor com a posições pi ia cout pi endl return 0 A função calloc também serve para alocar memória mas possui um protótipo um pouco diferente void calloc unsigned int num unsigned int size Aloca memória suficiente para um vetor de num objetos de tamanho size Retorna um ponteiro void para o primeiro byte alocado Retorna NULL se não houver memória suficiente Basicamente a função calloc faz o mesmo que a função malloc A diferença é que agora passamos a quantidade de posições a serem alocadas e o tamanho do tipo de dado alocado como parâmetros distintos da função Alocação Dinâmica de Memória calloc Exemplo usando calloc include iostream using namespace std include stdlibh Para usar malloc int main int p int a int i cin a p int calloc a sizeof int Aloca a números inteiros if p cout Erro Memoria Insuficiente endl exit0 for i0 ia i p pode ser tratado como um vetor com a posições pi ia cout pi endl return 0 A função realloc serve para realocar memória e tem o seguinte protótipo void realloc void ptr unsigned int num A função modifica o tamanho da memória previamente alocada apontada por ptr para aquele especificado por num O valor de num pode ser maior ou menor que o original Se não houver memória suficiente para a realocação um ponteiro nulo é devolvido e o bloco original é deixado inalterado Alocação Dinâmica de Memória realloc Exemplo usando realloc include iostream using namespace std include stdlibh Para usar malloc int main int p int a30 int i p int malloc asizeofint Aloca a números inteiros if p cout Erro Memoria Insuficiente endl exit0 for i0 ia i p pode ser tratado como um vetor com a posições pi ia O tamanho de p deve ser modificado por algum motivo a 100 p realloc p asizeofint for i0 ia i p pode ser tratado como um vetor com a posições pi ai return 0 Alocação Dinâmica de Memória realloc Observações sobre realloc Se ptr for nulo aloca num bytes e devolve um ponteiro igual malloc se num é zero a memória apontada por ptr é liberada igual free Se não houver memória suficiente para a alocação um ponteiro nulo é devolvido e o bloco original é deixado inalterado Alocação Dinâmica de Memória free Diferente das variáveis definidas durante a escrita do programa as variáveis alocadas dinamicamente não são liberadas automaticamente pelo programa Quando alocamos memória dinamicamente é necessário que nós a liberemos quando ela não for mais necessária Para isto existe a função free cujo protótipo é void free void p Alocação Dinâmica de Memória free Assim para liberar a memória basta passar como parâmetro para a função free o ponteiro que aponta para o início da memória a ser desalocada Como o programa sabe quantos bytes devem ser liberados Quando se aloca a memória o programa guarda o número de bytes alocados numa tabela de alocação interna Exemplo usando free include iostream using namespace std include stdlibh Para usar malloc int main int p int a int i cin a p int malloc asizeofint Aloca a números inteiros if p cout Erro Memoria Insuficiente endl exit0 freep return 0 Resumo Função Finalidade Sintaxe Exemplo malloc Alocar memória void malloc unsigned int num char p p char malloc100 int p p int malloc50sizeofint calloc Alocar memória void calloc unsigned int num unsigned int size int p p int calloc50sizeofint realloc Realocar memória void realloc void ptr unsigned int num int p p int calloc50sizeofint p reallocp 10sizeofint free Liberar memória freep int p p int calloc50sizeofint p reallocp 10sizeofint freep Exercício 21 Faça um programa que leia uma quantidade qualquer de números armazenandoos na memória e pare a leitura quando o usuário entrar um número negativo Em seguida imprima o vetor lido Use a função REALLOC Exercício 22 Faça um programa que pergunte ao usuário quantos valores ele deseja armazenar em um vetor de double depois use a função MALLOC para reservar alocar o espaço de memória de acordo com o especificado pelo usuário Esse vetor deve ter um tamanho maior ou igual a 10 elementos Use este vetor dinâmico como um vetor comum atribuindo aos 10 primeiros elementos do vetor os valores dos respectivos índices 100 Exiba na tela os valores armazenados nos 10 primeiros elementos do vetor
Envie sua pergunta para a IA e receba a resposta na hora
Recomendado para você
1
Verificação de Sorteio para Visto de Estágio
Introdução à Lógica e Programação
UFAL
7
Implementação de Busca Binária e Funções de Ordenação em C++
Introdução à Lógica e Programação
UFAL
10
Introdução às Strings em C++
Introdução à Lógica e Programação
UFAL
18
Conceitos sobre Vetores em Programação
Introdução à Lógica e Programação
UFAL
35
Introdução a Ponteiros e Arrays em C
Introdução à Lógica e Programação
UFAL
18
Introdução a Vetores em Programação
Introdução à Lógica e Programação
UFAL
33
Programa em C para Calcular Soma e Produto de Dois Números
Introdução à Lógica e Programação
UFAL
7
Estruturas de Dados: Pilhas, Filas e Listas em C
Introdução à Lógica e Programação
UFAL
1
Ordenação de Playlist Musical de Maria
Introdução à Lógica e Programação
UFAL
1
Programa para Multiplicação de Partes em Ragnarok Online
Introdução à Lógica e Programação
UFAL
Texto de pré-visualização
Ponteiros Toda variável tem um endereço ou uma posição associados na memória O endereço é visto como um ponteiro ou apontador É uma referência para a posição de memória de uma variável Ponteiros fornecem um modo de acesso à variável sem referenciála diretamente Um endereço pode ser armazenado em uma variável do tipo ponteiro ponteiro variável Ponteiro variável é uma variável que contém o endereço de outra variável o P aponta para V Valor 1 Endereço 4 Endereço 5 Endereço 4 Endereço 3 Endereço 2 Endereço 1 P V P endereço da variável V 3 Ponteiros 4 int p declara p tipo ponteiro para inteiro int v declara v tipo inteiro p v atribui o endereço de v ao ponteiro p ou seja apontase p para v int i j int ip i 12 ip i j ip ip 21 A variável ip armazena um ponteiro para um inteiro O endereço de i é armazenado em ip O conteúdo da posição apontada por ip é armazenado em j O conteúdo da posição apontada por ip passa a ser 21 Arrays 5 Ex float m10 pf pf m Referenciando Arrays 6 float m10 n10 float pf Em float m10 m é uma constante que endereça o primeiro elemento do array Portanto não é possível mudar o valor de m m n pf m erro m é constante ok Referenciando Elementos de Arrays 7 Podese referenciar os elementos de um array através de ponteiros float m 10 30 575 2345 float pf pf m2 cout pf 575 Referenciando Elementos de Arrays 8 Podese utilizar ponteiros e colchetes float m 10 30 575 2345 float pf pf m2 cout pf1 2345 Note que o valor entre colchetes é o deslocamento a ser considerado a partir do endereço de referencia pfn indica enésimo elemento a partir de pf Vamos ao código C Crie um programa C Parte I No programa principal defina um array vetor de 5 posições Inicialize os elementos desse vetor com a seguinte regra o vetori i 2 o Utilize a estrutura for Crie uma estrutura de repetição for para imprimir esses 5 elemento do vetor Teste o seu programa Parte II Crie uma função chamada initvetor para iniciar esse vetor o O código criado para inicializar o vetor deve ser movido para essa função Crie uma função chamada listvetor para listar os elementos desse vetor o O código criado para imprimir os elementos desse vetor deve ser movido para essa função Teste o seu programa Analise e reflita sobre as alterações 9 Vamos ao código C 10 include iostream using namespace std void initvetorfloat v int vsize for int i 0 i vsize i vi i 2 void listvetorfloat v int vsize for int i 0 i vsize i cout O elemento i do vetor e vi endl int main int n 5 float vetn cout o tamanho do vetor eh sizeofvet sizeofvet0 endl initvetorvet n listvetorvet n Ponteiros e Strings Strings são arrays de caracteres e podem ser acessadas usando char O incremento de pc o posiciona sobre o próximo caractere byte a byte 11 int main char str abcdef pc for pc str pc 0 pc cout pc Resultado abcdef Ponteiros e String Com base na função StrCopyC abaixo você deverá construir um programa em C com duas variáveis chamadas frase1 e frase2 A variável frase1 deverá conter uma frase qualquer e deverá ser copiada para a variável frase2 utilizando a função abaixo 12 void StrCopyCchar destino char origem while origem destino origem origem destino destino 0 Ponteiros e String 13 include iostream using namespace std void StrCopyCchar destino char origem a função tem como argumentos ponteiros while origem destino origem origem destino destino 0 indica final da string int main char frase150 Universidade Federal da Bahia frase250 StrCopyCfrase20 frase10 envia o primeiro endereço da string cout frase1 endl altere o programa para enviar o nésimo endereo de frase1 cout frase2 endl analise o resultado Exercício 20 Faça um programa que leia dois valores inteiros e chame uma função que receba estes 2 valores de entrada e retorne o maior valor na primeira variável e o menor valor na segunda variável Escreva o conteúdo das 2 variáveis na tela 14 Exercício 20 15 include iostream using namespace std void maiormenorint n1 int n2 int temp ifn1 n2 temp n1 n1 n2 n2 temp int main int num1 num2 cout Informe o primeiro numero endl cin num1 cout Informe o segundo numero endl cin num2 maiormenornum1 num2 cout O maior numero e num1 endl cout O segundo numero e num2 endl return 0 Contexto Errado Não sabemos o valor de N Funciona mas não é o mais indicado Faça um programa para cadastrar o preço de N produtos em que N é um valor informado pelo usuário Sempre que escrevemos um programa é preciso reservar espaço para as informações que serão processadas Para isso utilizamos as variáveis Uma variável é uma posição de memória que armazena uma informação que pode ser modificada pelo programa Ela deve ser definida antes de ser usada Quanto de memória um programa irá precisar Alocação Dinâmica Permite ao programador alocar memória para variáveis quando o programa está em execução e não apensa quando se está escrevendo o programa Quantidade de memória alocada sob demanda ou seja quando o programa precisa Menor desperdício de memória o Espaço é reservado até liberação explícita o Depois de liberado estará disponível para outros usos e não poderá mais ser acessado o Espaço alocado e não liberado explicitamente é automaticamente liberado ao final da execução Alocação de Memória Alocando 5 posições de memória em int p Memória posição variável conteúdo 119 120 121 int p NULL 122 123 124 125 126 127 128 Memória posição variável conteúdo 119 120 121 int p 123 122 123 p0 11 124 p1 25 125 p2 32 126 p3 44 127 p4 52 128 Alocação Dinâmica de Memória A linguagem C ANSI usa apenas 4 funções para o sistema de alocação dinâmica de memória malloc calloc realloc free Disponíveis stdlibh cstdlib Alocação Dinâmica de Memória malloc A função malloc serve para alocar memória e tem o seguinte protótipo void malloc unsigned int num Ou seja Dado um número de bytes que queremos alocar num Aloca na memória e retorna um ponteiro void para o primeiro byte alocada Se não houver memória suficiente para alocar a memória requisitada a função malloc retorna um ponteiro nulo NULL Alocação Dinâmica de Memória malloc O ponteiro void pode ser atribuído a qualquer tipo de ponteiro via type cast Se não houver memória suficiente para alocar a memória requisitada a função malloc retorna um ponteiro nulo Operador sizeof Operador em tempo de compilação que retorna o tamanho em bytes da variável ou especificador de tipo em parênteses que ele precede int float char Exemplo include iostream include stdlibh using namespace std struct ponto int x y int main cout char sizeofchar endl cout int sizeofint endl cout float sizeoffloat endl cout ponto sizeofponto endl return 0 Alocação Dinâmica de Memória malloc Alocar 1000 bytes de memória livre Alocar espaço para 50 inteiros cast Utilizado para forçar uma expressão a ser de um determinado tipo Formato tipo expressão int x 100 float f float x2 Exemplo usando malloc include iostream using namespace std include stdlibh Para usar malloc int main int p int a int i cin a p int malloc asizeofint Aloca a números inteiros if p ou p NULL cout Erro Memoria Insuficiente endl exit0 for i0 ia i p pode ser tratado como um vetor com a posições pi ia cout pi endl return 0 A função calloc também serve para alocar memória mas possui um protótipo um pouco diferente void calloc unsigned int num unsigned int size Aloca memória suficiente para um vetor de num objetos de tamanho size Retorna um ponteiro void para o primeiro byte alocado Retorna NULL se não houver memória suficiente Basicamente a função calloc faz o mesmo que a função malloc A diferença é que agora passamos a quantidade de posições a serem alocadas e o tamanho do tipo de dado alocado como parâmetros distintos da função Alocação Dinâmica de Memória calloc Exemplo usando calloc include iostream using namespace std include stdlibh Para usar malloc int main int p int a int i cin a p int calloc a sizeof int Aloca a números inteiros if p cout Erro Memoria Insuficiente endl exit0 for i0 ia i p pode ser tratado como um vetor com a posições pi ia cout pi endl return 0 A função realloc serve para realocar memória e tem o seguinte protótipo void realloc void ptr unsigned int num A função modifica o tamanho da memória previamente alocada apontada por ptr para aquele especificado por num O valor de num pode ser maior ou menor que o original Se não houver memória suficiente para a realocação um ponteiro nulo é devolvido e o bloco original é deixado inalterado Alocação Dinâmica de Memória realloc Exemplo usando realloc include iostream using namespace std include stdlibh Para usar malloc int main int p int a30 int i p int malloc asizeofint Aloca a números inteiros if p cout Erro Memoria Insuficiente endl exit0 for i0 ia i p pode ser tratado como um vetor com a posições pi ia O tamanho de p deve ser modificado por algum motivo a 100 p realloc p asizeofint for i0 ia i p pode ser tratado como um vetor com a posições pi ai return 0 Alocação Dinâmica de Memória realloc Observações sobre realloc Se ptr for nulo aloca num bytes e devolve um ponteiro igual malloc se num é zero a memória apontada por ptr é liberada igual free Se não houver memória suficiente para a alocação um ponteiro nulo é devolvido e o bloco original é deixado inalterado Alocação Dinâmica de Memória free Diferente das variáveis definidas durante a escrita do programa as variáveis alocadas dinamicamente não são liberadas automaticamente pelo programa Quando alocamos memória dinamicamente é necessário que nós a liberemos quando ela não for mais necessária Para isto existe a função free cujo protótipo é void free void p Alocação Dinâmica de Memória free Assim para liberar a memória basta passar como parâmetro para a função free o ponteiro que aponta para o início da memória a ser desalocada Como o programa sabe quantos bytes devem ser liberados Quando se aloca a memória o programa guarda o número de bytes alocados numa tabela de alocação interna Exemplo usando free include iostream using namespace std include stdlibh Para usar malloc int main int p int a int i cin a p int malloc asizeofint Aloca a números inteiros if p cout Erro Memoria Insuficiente endl exit0 freep return 0 Resumo Função Finalidade Sintaxe Exemplo malloc Alocar memória void malloc unsigned int num char p p char malloc100 int p p int malloc50sizeofint calloc Alocar memória void calloc unsigned int num unsigned int size int p p int calloc50sizeofint realloc Realocar memória void realloc void ptr unsigned int num int p p int calloc50sizeofint p reallocp 10sizeofint free Liberar memória freep int p p int calloc50sizeofint p reallocp 10sizeofint freep Exercício 21 Faça um programa que leia uma quantidade qualquer de números armazenandoos na memória e pare a leitura quando o usuário entrar um número negativo Em seguida imprima o vetor lido Use a função REALLOC Exercício 22 Faça um programa que pergunte ao usuário quantos valores ele deseja armazenar em um vetor de double depois use a função MALLOC para reservar alocar o espaço de memória de acordo com o especificado pelo usuário Esse vetor deve ter um tamanho maior ou igual a 10 elementos Use este vetor dinâmico como um vetor comum atribuindo aos 10 primeiros elementos do vetor os valores dos respectivos índices 100 Exiba na tela os valores armazenados nos 10 primeiros elementos do vetor