viciado 1 Denunciar post Postado Abril 8, 2009 Tenho algumas duvidas sobre ponteiro. Se possível uma explicação para cada dúvida fico grato. 1) Como ler um ponteiro ? scanf("%d",&p); ? 2) Como posso somar dois ponteiros ? 3) Como passo um ponteiro para função e como retorno um ponteiro de uma função ? Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Abril 9, 2009 1. Você lê normalmente, mas como o ponteiro já é um endereço de memória, você não precisa colocar o & na frente: scanf("%d", p); Nota, não coloque o & na frente do ponteiro, senão você vai estar tentando pegar o endereço do endereço da variável kkkkkk aí dá problema. 2. Se não me engano você faz assim: *p1 + *p2 retorna a soma dos dois. O * é para acessar o valor para o qual o ponteiro aponta. 3. A função deve aceitar um ponteiro como parâmetro. Nesse caso, você passa o ponteiro normalmente para a função como se fosse uma variável (ou passa uma variável qualquer para a função com &), a função então deve tratar como ponteiro. Você pode ter alguma variável ponteiro na sua função que você pode retornar normalmente, ou pode decidir retornar o endereço de uma variável (desaconselhado se você definiu ela dentro da função porque as variáveis locais da função são apagadas quando termina a execução dela, ou algo assim :P) Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Abril 9, 2009 As operações de soma, subtração, divisão e multiplicação com ponteiro é assim ? Pq divisão da 0 ? #include <stdio.h> #include <stdlib.h> int main() { int *p1, *p2, x, y; printf("Informe os valores de x e y \n"); scanf("%d %d",&x, &y); p1 = &x; p2 = &y; printf("Soma: %d \n",(*p1+*p2)); printf("Subtracao: %d \n",(*p1-*p2)); printf("Multiplicacao: %d \n",((*p1) * *(p2))); printf("Divisao: %f \n",(*p1 / *p2)); system("PAUSE"); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Abril 9, 2009 Divisão de inteiros, precisa esperar um int e não um float: printf("Divisao: %d \n",(*p1 / *p2)); Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Abril 9, 2009 Aritmética com ponteiros é diferente!! você está trabalhando com números naturais, como qualqer outro int... um exemplo de como percorrer um array com ponteiros: int n[]={9, 8, 7, 6, 5, 4 ,3 ,2, 1, -1}; int *i; i = n; while ((*i) != -1) { printf("%d esta armazenado em: %x\n", (*i), i); i++; } para saber mais: http://www.cs.umd.edu/class/sum2003/cmsc31...Op/pointer.html Ponteiros para funções é algo mais difícil porém é extremamente útil! tem muito material, de ótima qualidade no site cpluspluc.com para o seu caso: http://www.cplusplus.com/doc/tutorial/pointers/ [] Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Abril 9, 2009 Por o mesmo programa feito com função está errado ? "invalid type argument of 'unary *' #include <stdio.h> #include <stdlib.h> int soma(p1, p2){ return (*p1 + *p2); } int subtracao(p1, p2){ return (*p1 - *p2); } int mult(p1, p2){ return ((*p1) * (*p2)); } float div(p1, p2){ return (*p1 / *p2); } int main() { int *p1, *p2, x, y; printf("Informe os valores de x e y \n"); scanf("%d %d",&x, &y); p1 = &x; p2 = &y; printf("Soma: %d \n",soma(p1,p2)); printf("Subtracao: %d \n",subtracao(p1,p2)); printf("Multiplicacao: %d \n",mult(p1,p2)); printf("Divisao: %f \n",div(p1,p2)); system("PAUSE"); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Abril 9, 2009 você tem que especificar o que é p1 e p2.... a declaração da função está errada! o correto seria: int somar(int* p1, int* p2); E outra coisa... use e abuse dos parenteses quando tiver trabalhando com ponteiros, deixa a coisa menos confusa! Ao invés de: return (*p1 + *p2); faça: return((*p1) + (*p2));Assim, toda pessoa que ler, poderá presumir que se trata da soma dos valores guardados em p1 e p2.Como o simbolo * também é usado para multiplicação pode gerar confusão! :P abraços! Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Abril 9, 2009 Estou com problema na divisão float div(int *p1,int *p2){ return (float(*p1) / float(*p2)); } Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Abril 9, 2009 De nada! Que tipo de problema?? não tem muito o que fazer nessa sua função... talvez um casting resolva! float div(int *p1, int *p2) { return (float)((float)(*p1) / (float)(*p2)) } ou então float div(float *p1, float *p2) { return (*p1) / (*p2); Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Abril 9, 2009 O erro é conflicting types for 'div' O problema era que div já é reservado na biblioteca stdlib. Como eu posso inverter uma string utilizando ponteiro ? Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Abril 9, 2009 inverter uma string é fácil! agora depende, você quer inverter uma std::string ou um array de char's?? O processo é bem parecido com o que eu postei ali em cima. Poste o que você ja tem e onde está tendo dúvidas. Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Abril 9, 2009 Tentei fazer mais o programa não funcionou trava #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *p, str[20]; printf("Digite string \n"); fgets(str, 20, stdin); int tam = strlen(str); p = &str; int i; for(i=0;i<tam;i++){ printf("%s",*p); *p--; } system("PAUSE"); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Abril 9, 2009 isis@linux-8ogs:~/Desktop> gcc -g trava.c -Walltrava.c: In function ‘main’: trava.c:11: warning: assignment from incompatible pointer type trava.c:14: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’ trava.c:15: warning: value computed is not used #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *p, str[20]; printf("Digite string \n"); fgets(str, 20, stdin); int tam = strlen(str); p = str; int i; for(i=0;i<tam;i++){ printf("%s",p); p++; } return 0; } isis@linux-8ogs:~/Desktop> gcc -g trava.c -Wallisis@linux-8ogs:~/Desktop> ./a.out Digite string zxcvbnasd zxcvbnasd xcvbnasd cvbnasd vbnasd bnasd nasd asd sd d Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Abril 10, 2009 Não inverteu a string #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *p, str[20]; printf("Digite string \n"); fgets(str, 20, stdin); int tam = strlen(str); p = str; int i; for(i=0;i<tam;i++){ printf("%s",p); p--; } system("PAUSE"); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Abril 10, 2009 Cara, tem alguns erros no seu código... primeiro, não adianta você imprimir uma string a partir de "p", pois será impresso na ordem que estamos acostumados a ler, até encontrar um "\0" (char nulo) Se queremos inverter a string, devemos colocar o "p" no FINAL da string, e ai sim ir para o começo. veja só: int main() { char *p, str[20]; int tam; printf("Digite string \n"); fgets(str, 20, stdin); tam = strlen(str); //temos que colocar o nosso ponteiro no FINAL da string... //o final sempre será: começo + tamanho //porém, como a string foi inserida com fgets, os últimos dois caractéres são: "\n\0" p = str + tam - 2; int i; for(i=0;i<=tam;i++){ printf("%c", (*p)); p--; } return 0; }ps.: não compilei, tou sem compilador aqui. na teoria, o output ficaria assim: Digite String testando odnatset [] Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Abril 11, 2009 Funcionou obrigado. Quais outras operações são importantes aprender sobre ponteiro ? Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Abril 11, 2009 O mais importante é entender o funcionamento da coisa toda! Entender como funcionam arrays e outros tipos de estruturas de dados... Enfim, o importante é entender o conceito, para depois conseguir aplicar com sucesso! Não existem muitas operações para serem feitas com ponteiros. Só faz sentido: -somar dois ponteiros -somar um ponteiro com um integer -subtrair dois ponteiros para encontrar uma "distância" Mas isso o pessoal mais avançado pode te explicar melhor. Compartilhar este post Link para o post Compartilhar em outros sites