2010-01-19 22 views
5

Tengo una matriz que contiene punteros. ¿Cómo puedo intercambiar dos punteros, por ejemplo, matriz [1] y matriz [4], correctamente?C: cambiar punteros en una matriz

+0

Ahora que veo sus otras preguntas en las matrices, necesito preguntar: ¿esos punteros a las funciones? Si lo son, no se garantiza que las soluciones que usan 'void *' funcionen. –

+0

Estoy realizando el intercambio en una matriz int que contiene punteros como este: myPointerArray [0] apunta a la matriz [0], myPointerArray [1] apunta a la matriz [1] y así sucesivamente. ¿Puede eso causar problemas? – Pieter

+0

El único problema es si mezcla punteros a datos y apunta a funciones. En algunos datos y funciones de arquitectura, debe separar el espacio de direccionamiento y no puede hacer cosas como: 'int f(); void * p; ... p = f; '. Si obtengo lo que dice, debería estar bien, pero probablemente publique más código para estar seguro. –

Respuesta

5

Usted necesita una variable temporal:

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

Editar primera línea fija.

+1

¿Por qué 'void' es el tipo? – Pieter

+0

La línea 1 debe ser una matriz [4], ¿no? – ezod

+0

Su código es incorrecto, solo una confusión de índices de matriz. Está copiando matriz [1] a temp, luego sobrescribiendo matriz [4] y volviendo a poner la temperatura en matriz [1]. – Tony

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

Mi C es bastante oxidado, pero un simple

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

debería ser suficiente.

3

La forma más correcta utiliza una variable temporal como en:

void *tmp_pointer; 

.... 
tmp_pointer = array[1]; 
array[1] = array[4]; 
array[4] = tmp_pointer; 
.... 

Manténgase alejado de cualquier mal poco o INT hacks! :)

Permítanme añadir aquí que deberíamos haber pedido "qué tipo de puntero?"

En teoría, no se pueden mezclar con seguridad punteros a los datos e indicadores para su funcionamiento. El estándar C no garantiza que esto sea significativo o posible en absoluto. Sólo se asegura que:

  • punteros de datos pueden ser convertidos de nuevo y desde void *
  • ((void *) 0) es un puntero que es diferente de cualquier puntero de datos o puntero de función
  • punteros de función de una tipo se puede convertir a punteros a funciones de otro tipo y viceversa.

Entiendo que esto se debe a que en algunas arquitecturas, el espacio de direcciones para datos está completamente separado del espacio de direcciones para funciones y no se puede convertir de manera segura de tipos de punteros a otro.

+0

Aw, pero eso significa que no hay xor-swap ...: P – JPvdMerwe

+0

Imaginé que alguien sugeriría eso. Si no lo hicieron ya, ¡alguien lo hará! Es demasiado malo :) –

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])); 
} 

Es mucho más claro y guarda un temporal. ;-)

+2

Aunque necesita verificar que 1! = 4 o si pierde memoria, al anular un puntero. – JPvdMerwe

+0

@JP: Absolutamente correcto. –

+1

Tentado a darte -1 por "mucho más claro", lo cual es obviamente incorrecto. Pero la respuesta funciona, así que me abstendré de votar negativamente. :-) –