指针的异或运算可用于交换两个变量的值
2019-12-15 16:00:40来源:博客园 阅读 ()
指针的异或运算可用于交换两个变量的值
指针是不能直接进行异或运算的,需要将指针转换成整型int或long,在Linux系统下只能是long,因为指针在win系统占4个字节,在Linux系统占6个字节。
以下为两个指针的异或运算实现指针的交换:
#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系统中的运行结果为:
a:0x7ffc70da4cf0 b:0x4004e0 a:0x4004e0 b:0x7ffc70da4cf0
因此我们可以看到,交换两个值也不一定只能借助临时变量,异或运算也是一种选择。
以上代码来源于:https://blog.csdn.net/weixin_39666151/article/details/90731384
下面附上对线性表的置逆操作,使用单链表实现:
#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; }
下面附上线性表的置逆,用顺序表实现
#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; }
对上述单链表的操作好好参悟参悟
原文链接:https://www.cnblogs.com/biaobiao88/p/12042132.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:c++实现文件复制并修改相应属性
- C++ 运算符重载 2020-06-10
- C++ this指针 2020-06-03
- C++ new初始化与定位new运算符 2020-05-22
- 纯虚函数与基类指针数组的运用 代码参考 2020-04-30
- 重载矩阵加法运算 代码参考 2020-04-29
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash