Intercambia dos punteros usando XOR

Tengo una pregunta rápida sobre el uso de XOR two swap two string literals.

así que tengo lo siguiente:

#include  #include  #include  void intSwap(int *a, int *b){ *a=*a^*b; *b=*a^*b; *a=*a^*b; } void swapString(char **a, char **b){ char *temp=*a; *a=*b; *b=temp; } void main(){ char *s= "ha"; char *t= "Oh"; printf("%s and %s \n",s,t); // prints ha Oh swapString(&s,&t); printf("%s and %s \n",s,t); // prints Oh ha int a=10; int b=5; printf("%d %d\n",a,b); //print 10 5 intSwap(&a,&b); printf("%d %d\n",a,b); //print 5 10 } 

Como puede ver, utilicé la operación binaria XOR para intSwap. Sin embargo, cuando intenté hacer lo mismo con swapString, no funciona.

Aparece un mensaje de error que dice: operandos no válidos para binario ^ (tienen ‘char *’ y ‘char *’)

¿Sabes cómo usar XOR para intercambiar dos literales de cadena? ¿Es posible en C? ¡Gracias por delante!

No hay operaciones bitwise en los punteros. Las únicas operaciones que pueden actuar sobre eso aparte de la anulación de la diferencia son + y - . Así que necesitas lanzar a intptr_t y volver.

De todos modos, es una mala práctica y no te ahorrará ningún ciclo. Los comstackdores reconocerán los swaps usando tareas simples y los optimizarán para usted.

Si está utilizando C99 o superior, debe convertir el char * a intptr_t antes de operar, luego volver a convertir en un char * después de operar.

Su mensaje de error:

operandos inválidos a binario ^ (tienen ‘char *’ y ‘char *’)

Le dice que mientras entendió correctamente el concepto, el operador ^ no funciona con los punteros.

Tenga en cuenta que si su objective es hacer esto sin usar una variable adicional (tenga en cuenta que esto no es realmente más eficiente en los comstackdores modernos), puede hacerlo mediante la sum y la resta, que los punteros son suficientemente compatibles. Ver este sitio para más detalles.

intptr_t es un tipo entero que está destinado a contener valores de puntero. Nota intptr_t no es estrictamente hablando totalmente portátil (puede que no haya un tipo entero que pueda contener punteros) por esta respuesta SO .

* a = * b; significa que un carácter de b se copiará a una cadena que no sea la misma, lo mismo se aplica a la función swapString, por lo que esto generará un valor incorrecto.

Si intentas lo mismo con la longitud de cadena 1, esto funcionará … Gracias Vijayky