C puro

Sub-fórum especial para usuários que querem discutir/aprender programação, como as linguagens C/C++/C#, Java, HTML, e por aí vai...
Avatar do usuário
Fabio914
Mensagens: 1757
Registrado em: Dom Mai 21, 2006 4:38 pm
Answers: 0
17
Localização: Sampa/Sanca
Contato:

Re: C puro

Mensagem por Fabio914 »

DU0 escreveu:Tô ligado nisso ae dos procesadores. Mas anyway, as linguagens atuais são muito mais simples de se trabalhar até onde eu andei vendo. C não tem string por exemplo, o que pode tornar algumas tarefas simplesmente infernais :~

e em plena era do Quad Core é meio tenso querar programar alguma coisa pra um K6 500Mhz.
xD

Programador que é programador mesmo implementa tipos estruturados de dados na mão mesmo :roll:

Off:Em C você coloca um '\0' no final de um vetor de caracteres para caracterizar uma string...

Alias DU0, você fica falando que C é arcaico, mas se você comparar com outras linguagens como COBOL, BASIC, FORTRAN , etc... Você verá que C é ainda muito moderno. Além disso C permite acesso a níveis de hardware (com operações com bits e uso de ponteiros, além da preocupação com endereços de retorno e pilha) e é muito bom para se ter um melhor conhecimento do que acontece com o computador. C também é uma linguagem bem versátil, ela te permite fazer quase tudo (por isso muitos a consideram dificil pois é possível fazer um código que não funcione e ele irá compilar)...
Rico escreveu:Ainda estou encalhado em ponteiros, não entendo essa porra!
Ponteiros é fácil... Depois que você entender o funcionamento você verá que é muito útil, principalmente quando você for implementar algoritmos para base de dados (como listas ligadas e árvores)...
Projetos em andamento
the Core
Eclipse

Projetos parados
Doom 3 on GZDoom
FSD Project

PC
AMD Athlon 64 X2 5200+ (2x 2.6Ghz)
2GB RAM (2x 1GB DDR2)
240GB (160GB SATA + 80GB SATA)
XFX nVidia GeForce 8600 GT (600mhz 256mb)
Placa Mãe ASUS M2N4 SLI (2x PCI-E 16x SLI, 4x DDR2 800, nForce 4)
Fonte 500W reais (esqueci o nome da marca)
Monitor LG Flatron 19'' LCD
Avatar do usuário
DU0
Mensagens: 6689
Registrado em: Sáb Abr 01, 2006 6:59 am
Answers: 0
18
Localização: Deimos Lab.
Contato:

Re: C puro

Mensagem por DU0 »

AH, com certeza né cara. Ele é extremamente funcional, mas é arcaico... igual ao Doom :3
Jogando atualmente:
Xbox 360: Ninja Gaiden Black
Xbox One: Need for Speed: Hot Pursuit, Yakuza 3
PlayStation 2: Fatal Frame 3: The Tormented
PlayStation 3: RE: The Darkside Chronicles, RE: The Umbrella Chronicles
Nintendo Switch: Phantasy Star, SIFU
Rico
Mensagens: 2354
Registrado em: Dom Set 10, 2006 11:49 am
Answers: 0
17
Localização: Atrás do DU0
Contato:

Re: C puro

Mensagem por Rico »

Haha... Fabio, assim que tiver um tempo pode criar um tópico aqui mesmo explicando Ponteiros?
[xfire]p0br3[/xfire]
Futuro PC:

CPU: AMD Athlon x2 64Bits 7750 2.7GHz Black Edition
MoBo: Asus M2 ou M3.
VGA: XFX Geforce 9800 GTX 512MB ou 1GB/256Bits
HD: Seagate 1TB
PSU: ATX 600w REAIS
RAM: 4GB Ram DDR2 Kingstone @800MHz [2x2Gb]
Avatar do usuário
Fabio914
Mensagens: 1757
Registrado em: Dom Mai 21, 2006 4:38 pm
Answers: 0
17
Localização: Sampa/Sanca
Contato:

Re: C puro

Mensagem por Fabio914 »

Rico escreveu:Haha... Fabio, assim que tiver um tempo pode criar um tópico aqui mesmo explicando Ponteiros?
Cara, eu explicaria de boa e ainda daria algum exemplo prático (alguma implementação) , mas eu to meio sem tempo pra fazer isso (ao menos para fazer isso de uma forma decente)... Mas segue abaixo algumas dicas...

Ponteiros

Ponteiros são variáveis que armazenam endereço de memória. Seu "tipo" descreve o tipo da variável o qual o endereço do ponteiro indica (ou seja, o tipo da variável "apontada" pelo ponteiro).

Operadores:

& : endereço da variável (retorna o endereço de memória de alguma variável). Exemplo:

Código: Selecionar todos

int * ponteiro; /* Ponteiro para variável do tipo int */
int var; /* Nossa variável */

ponteiro = &var; /* O ponteiro recebeu o endereço da nossa variável do tipo int */
* : "conteúdo", com esse operador você pode acessar o conteúdo do endereço de memória armazenado no ponteiro...
Continuando o exemplo...

Código: Selecionar todos

var = 5;

printf("%d",var); /* Imprime 5 na tela */
printf("%d",*ponteiro); /* Também imprime 5 na tela (pois é como se estivesse acessando a variável var) */
Um exemplo prático... Queremos uma função que altere o valor de uma variável. Em C não é possível passar variáveis por referência (como em C++ [espero o comentário do DU0 sobre isso]), portanto precisamos passar o endereço da variável que queremos alterar (passagem por endereço), assim modificando aquela posição de memória referente a aquela variável...

Código: Selecionar todos

void MudaPra5(int * ponteiro_para_var) /* Função que atribui valor 5 à variável */ 
{
*ponteiro_para_var = 5; /* Usamos o operador "conteúdo" para alterar o conteúdo daquele endereço de memória */
}
Note que não poderíamos passar a variável "por valor" (cópia), pois toda a memória alocada em uma função é desalocada (a não ser se a memória foi dinâmicamente alocada) ao final da execução desta função, assim a mudança que faríamos na variável (mudando seu valor para 5) seria feita numa variável que é uma cópia da original e ela seria perdida no final da execução da função, e não alteraríamos a original... Mas como passamos "por endereço", copiamos o endereço da variável original para um ponteiro e utilizando do operador de "conteúdo" nós alteramos o conteúdo da memória que tem aquele endereço, podendo assim alterar a variável original. Note ainda que o ponteiro criado dentro da função será perdido no final da execução dessa função, mas isso não importa pois ele servia apenas para que pudéssemos acessar o conteúdo da variável que queriamos alterar...

Atenção, a função acima é chamada da seguinte forma:

Código: Selecionar todos

MudaPra5(&var);
Utilizando o operador & para retornar o endereço da variável que queremos mudar...

Observação, ponteiros também servem para acessar variáveis criadas dinâmicamente durante a execução do programa (variáveís essas que não possuem nome e só podem ser acessadas com um ponteiro contendo seus endereços). Exemplo:

Código: Selecionar todos

ponteiro=(int *)malloc(sizeof(int)); /* Alocamos uma variável inteiro dinâmicamente, essa variável não possui nome e é alocada na heap do computador (e não nas mesmas posições de memória das variáveis alocadas em compilação */

*ponteiro = 5; /* Colocamos 5 nessa variável alocada dinâmicamente, o mesmo que MudaPra5(ponteiro); [note que não tem & , pois "ponteiro" já é um endereço] */

ponteiro=(int *)malloc(sizeof(int)); /* Fazendo isso novamente, nós alocamos outra variável dinâmica e perdemos a posição de memória da variável ao qual colocamos valor 5, você pode checar isso fazendo um printf de *ponteiro */
Observação, na alocação com o malloc foi feito um casting para "int *" (ponteiro para int) pois o malloc retorna um ponteiro do tipo "void *" (na verdade todos os ponteiros tem tamanhos iguais de memória, 4 bytes, independentemente para qual tipo de variável ele "aponta"), fazemos isso para evitar um warning do compilador mas mesmo sem fazer isso o programa funciona...

Observação 2.: "void *" é um ponteiro que pode apontar para qualquer tipo...

Exemplo de alocação de vetores e uso de ponteiros...

Código: Selecionar todos

int * vetor; /* Vetor de inteiros, este ponteiro aponta para a primeira posição de memória do vetor, um vetor tem seus itens em posições seguidas de memória (listas ligadas, por exemplo, não tem), assim podemos acessar as demais posições do vetor incrementando ou decrementando este ponteiro ( *(vetor+X) ) OU usando vetor[X], sendo X a posição no vetor */

vetor=(int *)malloc(10*sizeof(int)); /* Alocamos um vetor de 10 posições (de 0 a 9) */

vetor[0]=3; /* Posição 0 do vetor, recebe valor 3 */
*(vetor+1)=2; /* Posição 1 do vetor (ie.: vetor[1]) recebe 2 */
MudaPra5(vetor+2); /* Posição 2 do vetor recebe 5 */

Observação, quando incrementamos um ponteiro, ele passa a "apontar" (conter o endereço) da próxima posição de memória, deslocando em sizeof(tipo_da_variavel_apontada_pelo_ponteiro) a posição de memória.

Assim se *vetor é a posição, por exemplo, 1000 da memória, *(vetor+1) ou vetor[1] será a posição 1008 da memória (se o tipo int da sua arquitetura tiver 8 bytes) e não 1001!

Acho que isso é o básico de ponteiros, se você quiser depois eu posto como usa ponteiros com estruturas, e como usa ponteiros para estruturas que contém ponteiros para outras estruturas! 8) (Listas Ligadas e Duplamente Ligadas).

Atenção, eu escrevi esse guia ai agora e nem revisei nem testei nada, leia por sua conta e risco... :wink:
Projetos em andamento
the Core
Eclipse

Projetos parados
Doom 3 on GZDoom
FSD Project

PC
AMD Athlon 64 X2 5200+ (2x 2.6Ghz)
2GB RAM (2x 1GB DDR2)
240GB (160GB SATA + 80GB SATA)
XFX nVidia GeForce 8600 GT (600mhz 256mb)
Placa Mãe ASUS M2N4 SLI (2x PCI-E 16x SLI, 4x DDR2 800, nForce 4)
Fonte 500W reais (esqueci o nome da marca)
Monitor LG Flatron 19'' LCD
Rico
Mensagens: 2354
Registrado em: Dom Set 10, 2006 11:49 am
Answers: 0
17
Localização: Atrás do DU0
Contato:

Re: C puro

Mensagem por Rico »

Agora eu vou tentar fazer uns programas usando ponteiros... é possível que eu use no Chat 2... talvez... mas talvez não haja necessidade.
[xfire]p0br3[/xfire]
Futuro PC:

CPU: AMD Athlon x2 64Bits 7750 2.7GHz Black Edition
MoBo: Asus M2 ou M3.
VGA: XFX Geforce 9800 GTX 512MB ou 1GB/256Bits
HD: Seagate 1TB
PSU: ATX 600w REAIS
RAM: 4GB Ram DDR2 Kingstone @800MHz [2x2Gb]