2010-01-19 2 views
5

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

+0

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. –

+0

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

+0

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. –

risposta

5

Hai bisogno di un variabile temporanea:

void*temp = array[4]; 
array[4]=array[1]; 
array[1] = temp; 

Modifica fisso prima linea.

+1

Perché "void" è il tipo? – Pieter

+0

La riga 1 deve essere array [4], no? – ezod

+0

Il tuo codice è sbagliato, solo una confusione di indici di array. Sta copiando l'array [1] su temp, quindi sovrascrive l'array [4] e reinserisce il temp all'array [1]. – Tony

5
void* temp = array[1]; 
array[1] = array[4]; 
array[4] = temp; 
0

mio C è piuttosto arrugginita, ma una semplice

int * foo = array [4]; array [4] = array [1]; array [1] = pippo;

dovrebbe essere sufficiente.

3

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.

+0

Aw, ma ciò significa no xor-swap ...: P – JPvdMerwe

+0

Ho immaginato che qualcuno lo suggerisse. Se non l'hanno già fatto, qualcuno lo farà! È troppo malvagio :) –

1
#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. ;-)

+2

Anche se è necessario controllare che 1! = 4 o altro si perde memoria, annullando un puntatore. – JPvdMerwe

+0

@ JP: assolutamente corretto. –

+1

Tentativo di darti -1 per "molto più chiaro" che è ovviamente sbagliato. Ma la risposta funziona così mi asterrò dal downvoting. :-) –