C: dúvida em função de ponteiros

Fala feras :smiley:

To estudando C e montei uma função que deveria somar os valores do vetor. Pensei em passar um ponteiro e dentro da função, ir incrementando a posição de memória e pegando o valor de lá, mas não deu certo. Na linha valorTotal = **vetor; da um erro de compilação e não entendo o pq do erro "23 C:\Documents and Settings\Administrador\Desktop\Estudo P2\main.c invalid type argument of `unary *’ "

#include <stdio.h>
#include <stdlib.h>
#define TAMANHO 5

int main(int argc, char *argv[])
{
  int i;
  int vetor[TAMANHO];
  int valorTotal = 0;
  for(i=0; i<TAMANHO; i++){
     printf("Valor: ");
     scanf("%d", &vetor[i]);         
  }         
  valorTotal = calcularValores(vetor);
  printf("A soma eh %d", valorTotal);
  system("PAUSE");	
  return 0;
}

int calcularValores(int *vetor) {
    int i, valorTotal;
    for(i = 0; i<TAMANHO; i++){
       valorTotal = **vetor;
       *(vetor++);      
    }             
}    

Veja se isso traz alguma luz para vc :slight_smile:

[code]#include<stdio.h>
void xxx(int *vetor){
int i;
for(i=0;i<5;i++,vetor++)
printf(“i=>%d,vetor=>%p,*vetor=>%d\n”,i,vetor,*vetor);
}

int main(void){
int vetor[] = { 1,2,3,4,5};
xxx(vetor);
return 0;
}
[/code]

A primeira coisa é que é sempre aconselhável usar um ponteiro “const” para indicar que você não quer mexer no array, apenas consultá-lo (como é o caso do método calcularValores).

Ainda mais, se você sabe que vai percorrer um array, não declare o parâmetro como um ponteiro, e sim como um array.

Em C não somente é mais seguro como também permite ao compilador efetuar algumas otimizações que ele não pode fazer se tiver apenas “ponteiros puros”.
E de qualquer maneira, o correto teria de ser, já que você quer totalizar os elementos do array:

int calcularValores (int vetor[]) { int i, valorTotal = 0; for(i = 0; i<TAMANHO; i++) { valorTotal = valorTotal + vetor[i]; } return valorTotal; } >

[code] #include <stdio.h>
#include <stdlib.h>
#define TAMANHO 5

int calcularValores(int *vetor);

int main(int argc, char *argv[])
{
int i;
int vetor[TAMANHO];
int valorTotal = 0;
for(i=0; i<TAMANHO; i++){
printf(“Valor: “);
scanf(”%d”, &vetor[i]);
}
valorTotal = calcularValores(vetor);
printf(“A soma eh %d”, valorTotal);
system(“PAUSE”);
return 0;
}

int calcularValores(int *vetor) {
int i, valorTotal;
for(i = 0; i<TAMANHO; i++){
valorTotal+= vetor[i];

 }

return valorTotal;
}[/code]

O problema no seu código era referenciar um ponteiro para um ponteiro((**)no caso uma matriz), sendo que queria somar os elementos do vetor(*).

Você pode dereferenciar o ponteiro e extrair somente o endereço de memória usando o operador de dereferência &
&vetor[i]

PS: Nunca se esqueça de criar o protótipo da função. Em c pode ocasionar problemas quanto ao escopo das funções.

Julio-san, você se esqueceu que C é mais primitivo que o Java e não avisa que você se esqueceu de inicializar uma variável local (já me dei muito mal por causa disso, justamente quando fiquei programando anos seguidos com o Java e tive de fazer algumas coisas em C).
No seu caso, você esqueceu que valorTotal deve ser inicializado com zero.

é verdade. sem inicializar ela contem somente lixo de memória(de um tipo inteiro).
como é uma variavel de um tipo primitivo, pode não causar muito estrago, quanto um ponteiro(que poderia estar apontando uma área de memória que talvez o próprio win esteja utilizando), que lhe permite sobreescrever áreas de memória.

Sempre inicialize suas variáveis.

Não me lembro de que possa usar dois “*” seguidos como você tentou. O que você queria é

valorTotal += *(vetor + i);

Mas leia o que o pessoal escreveu aqui em cima…

os dois seguidos referenciam uma matriz de dados(um ponteiro para um ponteiro).

a referência de x[][] pode ser muito bem representada em x(**x){ };

Uso de ponteiros dá uma flexibilidade muito grande, mas se fizer cagada, o estrago é muito pior.

pode ser util para muita gente:

http://cplusplus.syntaxerrors.info/index.php?title=Main_Page