Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

viciado

[Resolvido] Ponteiro

Recommended Posts

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

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

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

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

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

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

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

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

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

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

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@linux-8ogs:~/Desktop> gcc -g trava.c -Wall

trava.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 -Wall

isis@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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.