指針是不能直接進行異或運算的,須要將指針轉換成整型int或long,在Linux系統下只能是long,由於指針在win系統佔4個字節,在Linux系統佔6個字節。node
如下爲兩個指針的異或運算實現指針的交換:ios
#include <stdio.h> int main() { int *a,*b; unsigned long aa,bb; printf("a:%p\n", a); printf("b:%p\n", b); aa = (unsigned long)a; //a變量指針轉換成整型 bb = (unsigned long)b; //b變量指針轉換成整型 printf("\n"); aa ^= bb; bb ^= aa; //此時bb=aa aa ^= bb; //此時aa=bb a = (int *)aa; //aa變量指針轉換成指針類型 b = (int *)bb; //bb變量指針轉換成指針類型 printf("a:%p\n", a); printf("b:%p\n", b); return 0; }
在Linux 64系統中的運行結果爲:c++
a:0x7ffc70da4cf0 b:0x4004e0 a:0x4004e0 b:0x7ffc70da4cf0
所以咱們能夠看到,交換兩個值也不必定只能藉助臨時變量,異或運算也是一種選擇。數組
以上代碼來源於:https://blog.csdn.net/weixin_39666151/article/details/90731384函數
下面附上對線性表的置逆操做,使用單鏈表實現:spa
#include<iostream> #include<bits/stdc++.h> #define int long long using namespace std; typedef struct { int len; int *next; //int listsize;//該項爲順序表的大小,本題不要求 }node; //置逆函數 void Inverse(node *list) { for(int i = 0;i < list->len / 2;i++)//第一個元素與最後一個元素交換,第二個元素與倒數第二個元素交換,以此類推,只要進行到表的一半便可,也能夠用臨時變量來交換數值,這樣作須要增長額外的存儲空間,^表示異或運算 { list->next[i] = list->next[i]^list->next[list->len - i - 1]; list->next[list->len - i - 1] = list->next[i]^list->next[list->len - i - 1]; list->next[i] = list->next[i]^list->next[list->len - i - 1]; } } void Print(node *list) { for(int i = 0;i < list->len;i++)//遍歷 cout << list->next[i] << " "; cout << endl; } signed main()//主函數,順序表的初始化及銷燬直接在主函數中實現了 { int i = 0; node *list;//定義一個結構體node指針 list = (node *)malloc(sizeof(node));//爲該指針動態申請存儲空間 cout << "請輸入元素個數:"; cin >> list->len;//輸入順序表的長度 list->next = (int *)malloc(sizeof(int)*list->len);//爲固定好長度的順序表動態申請存儲空間 ,強制轉換爲int型,以後再置逆的過程當中可以使用異或運算符,指針自己不能使用異或運算 cout << "請輸入元素:"; for(i = 0;i < list->len;i++)//循環輸入元素,用指針數組存儲 cin >> list->next[i]; cout << "置逆前的表爲:"; Print(list);//自定義函數輸出 Inverse(list);//置逆操做 cout << "置逆後的表爲:"; Print(list);//輸出置逆後的 free(list->next);//釋放開闢的空間,不要忘記結構體中的指針 free(list); return 0; }
下面附上線性表的置逆,用順序表實現.net
#include<iostream> #define int long long #include<map> using namespace std; signed main() { int n; int vis[100]; cin >> n; for(int i = 1;i <= n;i++) cin >> vis[i]; int i = 1; int j = n; while(i < j) { int temp; temp = vis[i]; vis[i] = vis[j]; vis[j] = temp; i++; j--; } for(int i = 1;i <= n;i++) cout << vis[i] << " "; cout << endl; return 0; }
對上述單鏈表的操做好好參悟參悟指針