Pré-processador e macros
12 de Novembro de 2016, 19:35 - sem comentários aindaO pré-processador da linguagem C faz alterações no código de determinadas diretivas antes de envia-lo ao compilador. Ele é usado para facilitar futuras manutenções no código.
Uma diretiva é o include, o pré-processador substitui o nome do arquivo pelo corpo do arquivo especificado. Quando o nome usa aspas, ele procura no diretório local e depois na pasta include e se o nome do arquivo estiver de entre <>, o pré-processador procura direto na pasta include.
Outra diretiva de pré-processamento é a diretiva de definição. Abaixo segue um exemplo:
#define NUM 3
int mult (int a)
{
int b = a * NUM;
return b;
}
Neste exemplo, todos os lugares que tiver a palavra NUM, será substituída pelo número 3.
Agora vamos fazer uma definição com parâmetros. Abaixo temos um exemplo:
#include <stdio.h>
#define SOMA(a,b) a + b
int main()
{
printf(“ %d “, SOMA(5,3));
return 0;
}
Neste exemplo, o que está acontecendo de verdade é que a palavra SOMA(5,3) está sendo substituída por 5 + 3.
Entretanto, é importante tomar alguns cuidados como no exemplo abaixo:
#include <stdio.h>
#define DIF(a,b) a – b
int main ()
{
printf(“ %d “, 2 * DIF(7,2));
return 0;
}
Neste caso, quando é feito a substituição de 2 * DIF(7,2) temos a expressão 2 * 7 - 2 que é igual a 12 em vez de 10. O código correto seria:
#include <stdio.h>
#define DIF(a,b) (a – b)
int main ()
{
printf(“ %d “, 2 * DIF(7,2));
return 0;
}
Ponteiros em Linguagem C - Parte 3 (Final)
5 de Novembro de 2016, 14:53 - sem comentários aindaAqui iremos falar um pouco sobre strings.
As strings são do tipo char*, isto permite que a gente escreva uma função similar ao strcpy().
Segue abaixo um exemplo:
#include<stdio.h>
void StrCpy(char *destino, char *origem)
{
while(*origem)
{
*destino=*origem;
origem++;
destino++;
}
*destino=’\0’;
}
int main()
{
char str1[100], str2[100], str3[100];
printf(“Entre com uma string: “);
gets (str1);
StrCpy(str2, str1);
StrCpy(str3, “Você digitou a string: ”);
printf(“\n%s%s\n”,str3,str2);
return(0);
}
Inicialmente podemos ver no exemplo acima que ponteiros podem ser passados como argumentos de funções. Na verdade é assim que funções como gets() e strcpy() funcionam.
E como está sendo alterados os valores? Quando os ponteiros recebem os argumentos, eles apontam para o endereço de memória da variável, fazendo alterações nelas, mesmo fora da função main.
Apesar de ponteiro ser um assunto extenso, não tenho a intensão de esgotar o assunto nos meus posts, mas vocês perceberam que o assunto será muitas vezes retomado durante alguns posts futuro.
Ponteiros em Linguagem C – Parte 2
27 de Outubro de 2016, 18:23 - sem comentários aindaAgora falaremos sobre ponteiros e vetores.
O vetor é um conjunto de variáveis do mesmo tipo, com um identificador comum e alocado de forma sequencial. Quando você declara um vetor:
Tipo_da_variavel nome_da_variavel [tamanho];
O compilador C calcula o tamanho, em bytes, necessário para armazenar o vetor na memória. Exemplo:
Int vet[10];
Int = 4 bytes
Então:
tamanho x tamanho_do_tipo
10 x 4 = 40 bytes
Após reserva o espaço necessário na memória, o identificador comum será o nome que você declarou para o vetor, sendo esse identificador um ponteiro que aponta para o primeiro elemento do vetor.
Para ficar mais claro, quando você declara nome_da_variavel[índice], seria a mesma coisa que você declarar *(nome_da_variavel+índice). Veja no exemplo abaixo:
#include<stdio.h>
int main()
{
int vet [50];
int *p;
int count;
p=vet;
for(count=0;count<50;count++)
vet[count]=count;
for(count=0;count<50;count++)
{
printf(“%d\t”,*p);
P++;
}
return (0);
}
Agora que sabemos que o nome de um vetor é na verdade um ponteiro, podemos concluir que os ponteiros podem ser transformados em vetores. Segue abaixo um exemplo:
#include<stdio.h>
int main()
{
int vet[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *p, count;
p=vet;
for(count-0; count<10; count++)
printf(“%d\n”,p[count]);
return (0);
}
Ponteiros em Linguagem C – Parte 1
18 de Outubro de 2016, 18:06 - sem comentários aindaDa mesma forma que int armazena inteiros e char armazena caracteres, os ponteiros armazenam endereços de memórias. E para que armazenar um endereço de memória? Simples, para poder recuperar os dados armazenados naquele local da memória. Existem alguns usos mais específicos para os ponteiros, mas não será abordado aqui.
Em Linguagem C, quando declaramos um ponteiro, temos que declarar o tipo da variável que vamos apontar. Para declararmos um ponteiro temos a seguinte forma geral:
Tipo_de_ponteiro *nome da variável;
O asterisco ( * ) indica para o compilador que a variável é um ponteiro. Abaixo segue exemplos de declarações:
int *pt;
char *temp, *pt2;
Obs.: É importante que nunca se esqueça de usar o asterisco ( * ), pois ele indica que está sendo manipulado os valores que o ponteiro está apontando.
Outro operador importante é o &. Ele é usado para obter o endereço de memória de uma variável. Como podemos ver no exemplo abaixo:
int count = 10;
int *pt;
pt = &count;
Como você pode ver no exemplo, para pegamos o valor do endereço de memória da variável count não é usado o asterisco ( * ). Após o ponteiro pt ser apontado para a variável count, podemos ler e escrever na variável por meio do ponteiro.
Segue abaixo um exemplo simples de ponteiro:
#include<stdio.h>
int main()
{
int num, *p;
num = 55;
p=#
printf(“Valor inicial: %d\n”, num);
*p=100;
printf(“Valor final: %d \n”, num);
printf(“Valor da variável apontada: %d\n”, *p);
printf(“Endereço da variável: %p\n”, p);
return (0);
}
E como você faria para somar +1 em um ponteiro? Simples, basta indicar que a soma de +1 é no valor que o ponteiro está apontando. Ex.: (*p)++;
Calculadora Simples em Linguagem C
8 de Outubro de 2016, 19:20 - Um comentárioQuem nunca tentou fazer uma calculadora simples e no final acabou fazendo algo relativamente complicado. Nesse artigo é explicado como fazer uma calculadora de operações simples e sem nenhuma complicação.
Para fazer a calculadora, será necessário ter duas variáveis do tipo float ou double para receber os números e uma variável char para receber o operador. O comando para receber os valores é scanf(“%f %c %f”, &num1, &op, &num2), sendo verificado o operador pelo comando switch() para fazer a operação. Ponto, já temos a calculadora. Segue abaixo um código de exemplo.
#include<stdio.h>
int main()
{
float num1, num2;
char op;
printf (“Digite uma expressão (Ex.: 1+1): “);
scanf (“%f %c %f”, &num1, &op, &num2);
switch(op)
{
case ‘+’:
printf(“\n\t%.2f %c %.2f = %.2f\n\n”, num1, op, num2, num1+num2);
break;
case ‘-’:
printf(“\n\t%.2f %c %.2f = %.2f\n\n”, num1, op, num2, num1-num2);
break;
case ‘*’:
printf(“\n\t%.2f %c %.2f = %.2f\n\n”, num1, op, num2, num1*num2);
break;
case ‘/’:
if(num2 != 0)
printf(“\n\t%.2f %c %.2f = %.2f\n\n”, num1, op, num2, num1/num2);
else
printf(“Nenhum número pode ser dividido por zero!\n\n”);
break;
default:
printf(“Operação invalida!\n\n”);
break;
}
return 0;
}