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
Respuesta
Usted necesita una variable temporal:
void*temp = array[4];
array[4]=array[1];
array[1] = temp;
Editar primera línea fija.
void* temp = array[1];
array[1] = array[4];
array[4] = temp;
Mi C es bastante oxidado, pero un simple
int * foo = array [4]; matriz [4] = matriz [1]; matriz [1] = foo;
debería ser suficiente.
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.
Aw, pero eso significa que no hay xor-swap ...: P – JPvdMerwe
Imaginé que alguien sugeriría eso. Si no lo hicieron ya, ¡alguien lo hará! Es demasiado malo :) –
#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. ;-)
Aunque necesita verificar que 1! = 4 o si pierde memoria, al anular un puntero. – JPvdMerwe
@JP: Absolutamente correcto. –
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. :-) –
- 1. matriz de punteros C
- 2. punteros de matriz C++ [] o ++
- 3. Matriz de punteros de función en C
- 4. Cómo ordenar una matriz de punteros a char en C?
- 5. ¿Puedo crear una matriz de punteros Char en C?
- 6. ¿Cómo asignar dinámicamente una matriz de punteros en C++?
- 7. Punteros en C# para hacer una matriz int?
- 8. creando una matriz de punteros a objetos C++
- 9. ¿Cómo funciona una matriz de punteros a punteros?
- 10. C++ Punteros a punteros en Java
- 11. C: forma inteligente de "cambiar" una matriz?
- 12. ¿Cómo creo una matriz de punteros?
- 13. malloc una matriz de punteros struct
- 14. Void punteros a struct punteros en C
- 15. una matriz de punteros que apuntan a la misma matriz
- 16. uso constante con punteros en C
- 17. Incrementando punteros C
- 18. punteros void en C++
- 19. C: ¿Cuál es mejor? Malloc matriz de punteros a las estructuras, o una matriz de estructuras?
- 20. ¿Cómo cambiar el inicio de una matriz en C#?
- 21. ¿Cómo puedo cambiar el tamaño de una matriz en C?
- 22. punteros vacío en C++
- 23. Inicializando punteros en C++
- 24. Puntero a matriz de punteros
- 25. ¿Cómo puedo declarar e inicializar una matriz de punteros a una estructura en C?
- 26. PInvoke, punteros y copia de matriz
- 27. C++: matriz de punteros de función miembro a diferentes funciones
- 28. Matriz de punteros de función en Java
- 29. Cambiar punteros en una función en el lenguaje de programación C
- 30. Puntero a una matriz de punteros a listas vinculadas
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. –
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
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. –