2015-06-29 22 views
5

In questo programma sono stati creati due puntatori (a, b) che puntano all'indirizzo di memoria di xey. Nella funzione che ho creato dovrebbe scambiare l'indirizzo di memoria di aeb (Quindi b = a e a = b). Quando compilo mi dà un errore (conversione non valida da 'int' a 'int *') Che cosa significa? Sto passando un puntatore alla funzione o la legge come una normale int?Passaggio di un punto a una funzione

#include <iostream> 
using std::cin; 
using std::cout; 
using std::endl; 
void pointer(int* x,int* y)// Swaps the memory address to a,b 
{ 
    int *c; 
    *c = *x; 
    *x = *y; 
    *y = *c; 
} 

int main() 
{ 
    int x,y; 
    int* a = &x; 
    int* b = &y; 
    cout<< "Adress of a: "<<a<<" Adress of b: "<<b<<endl; // Display both memory address 

    pointer(*a,*b); 
    cout<< "Adress of a: "<<a<<" Adress of b: "<<b<<endl; // Displays the swap of memory address 

    return 0; 
} 

messaggio di errore:

C++.cpp: In function 'int main()':
C++.cpp:20:16: error: invalid conversion from 'int' to 'int*' [-fpermissive]
C++.cpp:6:6: error: initializing argument 1 of 'void pointer(int*, int*)' [-fpermissive]
C++.cpp:20:16: error: invalid conversion from 'int' to 'int*' [-fpermissive]
C++.cpp:6:6: error: initializing argument 2 of 'void pointer(int*, int*)' [-fpermissive]

+0

In realtà si desidera scambiare i valori puntati verso i puntatori o scambiare gli indirizzi delle variabili? Solo chiedendo, perché come ha sottolineato Vlad, stai scambiando i valori e questo può essere fatto senza alcun suggerimento (che è molto più bello). – user463035818

+0

Sto scambiando l'indirizzo di memoria. –

+0

Beh, questo è interessante. Forse proprio non capisco, ma ho problemi a capire come potrebbe essere usato. Non è così: qualsiasi puntatore che punta a 'a' prima punterà a' b' dopo lo scambio. Quindi ha praticamente lo stesso effetto di scambiare i valori, o sono troppo confuso ?? – user463035818

risposta

2

In questa chiamata di funzione

pointer(*a,*b); 

espressioni *a e *b hanno tipo int mentre i parametri corrispondenti della funzione sono di tipo int *.

Se si desidera scambiare due puntatori e non i valori (oggetti x e y) puntato da puntatori poi la funzione dovrebbe guardare modo seguente

void pointer(int **x, int **y)// Swaps the memory address to a,b 
{ 
    int *c = *x; 
    *x = *y; 
    *y = c; 
} 

e chiamò come

pointer(&a, &b); 

Oppure è possibile definire i parametri come aventi tipi di riferimento. Per esempio

void pointer(int * &x, int * &y)// Swaps the memory address to a,b 
{ 
    int *c = x; 
    x = y; 
    y = c; 
} 

e chiamarlo come

pointer(a, b); 
+0

Grazie a tutti! Sono stato perplesso! –

+0

Meglio ancora, chiama la tua funzione qualcosa come 'pointerSwap()' piuttosto che il 'puntatore non informativo '()' –

+1

@Robin Hartland Non è la mia funzione :): userei std :: swap. :) –

3

*a e *b sono di tipo int, mentre a e b sono entrambi di tipo int*. La funzione prende due int* s', quindi tutto quello che dovete fare è cambiare

pointer(*a,*b); 

a

pointer(a,b); 
3

Si passa *x argomenti -> vuol dire che si sta dereferenziazione i puntatori, e passando il valore del luogo di memoria dove puntano a e b.

La soluzione è passare i puntatori, così usuale a e b poiché sono già i puntatori:
pointer(a,b)

0

Sia Puntatori *a & *b sono interi.
Ma le variabili a & b sono *int s.
Non far loro confusi insieme ... è necessario cambiare la vostra funzione pointer() a:

pointer(a, b); 

ciò che questo fa, Passa il pointers.since a e b sono già i puntatori, perché entrambi sono *int S.

Problemi correlati