viciado Postado Abril 8, 2009 Denunciar Share 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 ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Maligno Postado Abril 9, 2009 Denunciar Share Postado Abril 9, 2009 1) Como ler um ponteiro ? scanf("%d",&p); ?Nesse canf() você passa a referência de uma variável. Isso significa que scanf poderá modificar a variável original.2) Como posso somar dois ponteiros ?A aritmética de ponteiros existe para acessar elementos diretamente pela sua posição. Não faz sentido, portanto, somar ponteiros pura e simplesmente. Faria sentido sim, somar os conteúdos de dois ponteiros. Exemplo: *ptr1 + *ptr2.3) Como passo um ponteiro para função e como retorno um ponteiro de uma função ?Se você tem uma variável ponteiro, apenas informe seu nome como argumento da função chamada, desde que esta, em seu protótipo, exiga um ponteiro, claro. Exemplo: foo(ptr1). Mas lembre-se de que você também pode passar uma variável por referência, conforme o exemplo de scanf(), acima.Para retornar um ponteiro, se o protótipo desta função assim definir, apenas retorne o nome da variável em questão. Exemplo: return ptr1. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 viciado Postado Abril 9, 2009 Autor Denunciar Share Postado Abril 9, 2009 As operações de soma, subtração, divisão e multiplicação com ponteiro é assim ? porque 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; } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Maligno Postado Abril 9, 2009 Denunciar Share Postado Abril 9, 2009 Nem poderia ser diferente. Você quer exibir um inteiro como float sem fazer o devido cast. Troque a divisão por printf("Divisao: %f \n",(float)*p1 / (float)*p2);. Note que você até poderia fazer o cast apenas no resultado, mas daí você só veria a parte inteira do cálculo. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 viciado Postado Abril 9, 2009 Autor Denunciar Share 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; } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Maligno Postado Abril 9, 2009 Denunciar Share Postado Abril 9, 2009 1) Não está faltando nada na declaração das quatro funções dos cálculos?2) Você está persistindo no erro da divisão. Esqueceu do cast. Revise. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 viciado Postado Abril 9, 2009 Autor Denunciar Share Postado Abril 9, 2009 Não consegui resolver o problema do cast na função divisão#include <stdio.h> #include <stdlib.h> int soma(int *p1,int *p2){ return (*p1 + *p2); } int subtracao(int *p1,int *p2){ return (*p1 - *p2); } int mult(int *p1, int *p2){ return ((*p1) * (*p2)); } float div(int *p1,int *p2){ return((float)*p1 / (float)*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; } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Maligno Postado Abril 9, 2009 Denunciar Share Postado Abril 9, 2009 Agora não vejo erro algum. Qual o problema? Erro de compilação? Se sim, onde? Ou é erro de execução? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 viciado Postado Abril 9, 2009 Autor Denunciar Share Postado Abril 9, 2009 (editado) Erro na função divconflicting types for 'div'O problema era que div já é reservado na biblioteca stdlib.Como eu posso inverter uma string utilizando ponteiro ? Editado Abril 9, 2009 por viciado Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Maligno Postado Abril 9, 2009 Denunciar Share Postado Abril 9, 2009 O problema era que div já é reservado na biblioteca stdlib.Não se reserva palavra por header. Acabei de testar aqui e seu código não tem erro algum.Como eu posso inverter uma string utilizando ponteiro ?Acessando o conteúdo inversamente. Veja qual o tamanho da string, some o valor ao ponteiro e vá voltando numa malha. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 viciado Postado Abril 9, 2009 Autor Denunciar Share Postado Abril 9, 2009 vá voltando numa malha ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Maligno Postado Abril 9, 2009 Denunciar Share Postado Abril 9, 2009 Depois de adicionar ao ponteiro o total de bytes da string, ele apontará para o último elemento da string. Numa malha for() vá decrementando o ponteiro para acessar os elementos anteriores. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 viciado Postado Abril 9, 2009 Autor Denunciar Share 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; } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Maligno Postado Abril 10, 2009 Denunciar Share Postado Abril 10, 2009 p = &str está errado. Nem deve compilar. str já é um ponteiro. Você deve apenas copiar str para p. Ponteiro para ponteiro.O programa trava porque o loop vai ao infinito, já que i começa com 0 e vai sendo incrementado. Seu iterador i é inicializado de forma errada. Você não quer imprimir invertido? Então troque a malha inicializando com i=tam, troque o teste por i>=0 e ajuste o iterador com i--. Na impressão também tem erro. Não use %s, que é para string. Use %c (caractere), indicando o conteúdo do ponteiro com *(p+i). Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 viciado Postado Abril 10, 2009 Autor Denunciar Share 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; } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Maligno Postado Abril 10, 2009 Denunciar Share Postado Abril 10, 2009 Claro que não. A malha está do mesmo jeito.Quando você escrever uma malha desse tipo, observe qual o fluxo dos dados. Perceba como o ponteiro vai andar. Vou dar uma ajudinha. Seu iterador começa em zero. Deveria começar no final e não no começo. E se vai inverter, é natural que o iterador seja decrementado e não incrementado, como está agora. Sendo assim, quando a malha acaba? Quando o iterador for menor que zero.E outra: você não precisa mexer no valor do ponteiro, já que está usando um iterador. Use o ponteiro apenas para acessar o caractere. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
viciado
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 ?
Link para o comentário
Compartilhar em outros sites
15 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.