Поменяйте два указателя с помощью XOR

У меня есть быстрый вопрос об использовании XOR двух своп двух строковых литералов.

поэтому у меня есть следующее:

#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 } 

Как вы можете видеть, я использовал двоичную операцию XOR для intSwap. Однако, когда я пытался сделать то же самое с swapString, он не работает.

Я получаю сообщение об ошибке: недопустимые операнды в двоичный ^ (есть «char *» и «char *»)

Вы знаете, как использовать XOR для обмена двумя строковыми литералами? Возможно ли это в C? Спасибо заранее!

У указателей нет побитовых операций. Единственными операциями, которые могут воздействовать на это, кроме разблокировки, являются + и - . Таким образом, вам нужно intptr_t в intptr_t и обратно.

Во всяком случае, это плохая практика и не спасет вас от каких-либо циклов. Компиляторы будут распознавать свопы с использованием простых назначений и оптимизировать их для вас.

Если вы используете C99 или выше, вам необходимо intptr_t char * в intptr_t перед началом работы, а затем вернуть обратно в char * после работы.

Ваше сообщение об ошибке:

недействительные операнды в двоичные ^ (имеют ‘char *’ и ‘char *’)

Сообщает вам, что, пока вы правильно поняли концепцию, оператор ^ не работает над указателями.

Обратите внимание, что если ваша цель состоит в том, чтобы сделать это без использования дополнительной переменной (обратите внимание, что это не является более эффективным для современных компиляторов), вы можете сделать это, используя сложение и вычитание, которые указатели поддерживают достаточно хорошо. Подробнее см. На этом сайте .

intptr_t – целочисленный тип, предназначенный для хранения значений указателя. Примечание. intptr_t не является строго говоря полностью переносимым (не может быть целочисленного типа, который может содержать указатели) на этот SO-ответ .

* А = * Ь; означает, что один символ из b будет скопирован на не всю строку, то же самое относится к функции swapString, поэтому это приведет к неправильному значению.

Если вы попробуете то же самое с длиной строки 1, это будет работать. Спасибо Vijayky