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>
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;
}
T
thingol
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;
}
>
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.
T
thingol
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.
J
juliocbq
é 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.
dudaskank
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…
J
juliocbq
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.