Ho una matrice che contiene puntatori. Come posso scambiare due puntatori - ad esempio array [1] e array [4] - correttamente?C: scambiatore di puntatori in un array
risposta
Hai bisogno di un variabile temporanea:
void*temp = array[4];
array[4]=array[1];
array[1] = temp;
Modifica fisso prima linea.
void* temp = array[1];
array[1] = array[4];
array[4] = temp;
mio C è piuttosto arrugginita, ma una semplice
int * foo = array [4]; array [4] = array [1]; array [1] = pippo;
dovrebbe essere sufficiente.
Il modo più corretto sta usando una variabile temporanea come in:
void *tmp_pointer;
....
tmp_pointer = array[1];
array[1] = array[4];
array[4] = tmp_pointer;
....
stare lontano da qualsiasi po 'male o int hack! :)
Permettetemi di aggiungere che dovremmo avere chiesto "che tipo di puntatore?"
In teoria, non è possibile mescolare in modo sicuro i puntatori ai dati e puntatori a funzione. Lo standard C non garantisce che ciò sia significativo o possibile. Esso assicura che soltanto:
- puntatori di dati possono essere riconvertiti e da
void *
- ((void *) 0) è un puntatore che è diverso da qualsiasi puntatore di dati o puntatore a funzione
- puntatori a funzione di uno il tipo può essere convertito in puntatori a funzione di un altro tipo e viceversa.
Comprendo che ciò è dovuto al fatto che in alcune architetture, lo spazio degli indirizzi per i dati è completamente separato dallo spazio degli indirizzi per le funzioni e non è possibile convertire in modo sicuro da un tipo di puntatore all'altro e viceversa.
Aw, ma ciò significa no xor-swap ...: P – JPvdMerwe
Ho immaginato che qualcuno lo suggerisse. Se non l'hanno già fatto, qualcuno lo farà! È troppo malvagio :) –
#include <stdint.h>
if (1 != 4) {
array[1] = (void*)((intptr_t)(array[1])^(intptr_t)(array[4]));
array[4] = (void*)((intptr_t)(array[1])^(intptr_t)(array[4]));
array[1] = (void*)((intptr_t)(array[1])^(intptr_t)(array[4]));
}
È molto più chiaro e salva un temporaneo. ;-)
Anche se è necessario controllare che 1! = 4 o altro si perde memoria, annullando un puntatore. – JPvdMerwe
@ JP: assolutamente corretto. –
Tentativo di darti -1 per "molto più chiaro" che è ovviamente sbagliato. Ma la risposta funziona così mi asterrò dal downvoting. :-) –
Ora che vedo le altre tue domande sugli array, devo chiedere: sono quei puntatori di funzione? Se lo sono, le soluzioni che usano 'void *' non sono garantite per funzionare. –
Sto eseguendo lo scambio su un array int che contiene puntatori come questo: myPointerArray [0] punta all'array [0], myPointerArray [1] punta all'array [1] e così via. Può causare problemi? – Pieter
L'unico problema è se si mischiano i puntatori ai dati e i puntatori alle funzioni. Su alcuni dati e funzioni dell'architettura è necessario separare lo spazio di indirizzamento e non è possibile fare cose come: 'int f(); void * p; ... p = f; '. Se ottengo quello che dici dovresti essere ok ma probabilmente pubblichi qualche altro codice per essere sicuro. –