指针-----swap

“万能”的指针
 

今天试着做了做 用引用交换两个字符串的内容。

顺带着用指针做了一下。又一次体验了指针的强大

#include<iostream.h>
#include<string.h>
#include<malloc.h>

void swap(char *&a,char *&b); //此函数与void swap(char *a,char *b)并不是重载函数
void swap(char **a,char **b);
void swap(char *a,char *b);

//这是我做的几种尝试。

int main(void)
{
char *a = "Hello!";//注意此处a指向的是字符串常量,用一级指针是无法修改其内容的
char *b = "How are you?";
cout<<a<<endl;
cout<<b<<endl;
swap(a,b);//调用void swap(char *&a,char *&b)或void swap(char *a,char *b);
swap(&a,&b);//调用void swap(char **a,char **b);
cout<<a<<endl;
cout<<b<<endl;
return 0;
}

void swap(char *&a,char *&b)//利用 指针的引用
{
char *temp;
temp = a;
a = b;
b = temp;
}

void swap(char *a,char *b)//调用该程序,运行是崩溃
{
//这里虽然是想通过 传地址 改变值,无奈值却不是可以修改的。
char *temp;
temp = (char *)malloc (sizeof(a));
strcpy(temp,a);
strcpy(a,b); //此处 access violation
strcpy(b,temp); //同理 access violation
}

void swap(char *a,char *b)//若此处只是swap(a,b)值是不会交换的,传地址是无法改变地址的
{
char *temp;
temp = a;
a = b;
b = temp;//试图传地址改变地址。
//但是却达不到我们期望的swap的效果,该函数结束后,a,b的指向依旧没有变。
//传地址改变值。要想改变地址(指向),那就要传地址的地址了,也就是指针的指针。
}

下面的这个函数就是通过传指针的指针,来改变指向。

void swap(char **a,char **b)//只要有地址,就算你只是只读的,用指针的指针也是能改变其内容的
{
char *temp;
temp = *a;
*a = *b;
*b = temp;
}

 

总的一句话,只要有地址,就能用指针去改变内容。

再举一个例子吧:在c++类中,我们知道类的private和protected成员变量是不允许外部函数(也就是非成员函数)直接调用的,所以通常情况下在外部函数是不允许我们修改其内容的,但是指针又一次发挥了它的“万能”。

#include<iostream.h>
class A
{
private:
int m_a;
int m_b;
public:
A(int i,int j)
{
   m_a = i;
m_b = j;
}

void print()
{
   cout<<m_a<<<" "<m_b<<endl;
}
};

int main(void)
{
A a(2,3);
a.print();
int *p;
p = (int*)&a;
*p = 3;//修改私有成员m_a的值
*(p+1) = 4;//修改私有成员m_b的值
a.print();
return 0;
}
通过指针改变了私有成员变量

 

指针……传地址改内容,传地址的地址改变地址,……………………

S7-1500 PLC 是西门子 SIMATIC 系列中一款高性能的自动化控制器,支持多种数据操作和通信功能。在某些应用场景下,用户可能需要执行 **Swap(交换)** 操作,例如交换两个变量的值、字节顺序转换(如大端与小端之间的转换)、或是在自由口通信中对数据帧进行轮询发送等任务。 ### 数据交换(Swap)操作 在 S7-1500 中,可以通过以下几种方式实现 Swap 操作: #### 1. 使用 MOVE_BLK 或 SWAP 指令 S7-1500 支持通过 TIA Portal 编程环境中的标准指令库实现数据交换。虽然没有专门的 `SWAP` 指令,但可以使用 `MOVE_BLK` 指令结合临时存储区来完成两个变量的数据交换。 ```scl // 假设有两个变量 A 和 B,类型为 INT temp := A; A := B; B := temp; ``` #### 2. 字节顺序交换(Endianness 转换) 在处理网络通信或 Modbus 协议时,经常需要将双字(DWORD)或浮点数(REAL)的字节顺序进行交换。S7-1500 提供了 `SWAP_BYTES` 函数用于此类操作[^2]。 ```scl // 将 DWord 类型变量 dwValue 的字节顺序反转 dwSwapped := SWAP_BYTES(dwValue); ``` 该函数常用于 Modbus RTU 或 TCP/IP 协议栈中,以确保不同设备间的字节序一致。 #### 3. 在自由口通信中实现数据帧轮询 在自由口通信场景中,例如使用 `Send_P2P` 和 `Receive_P2P` 指令进行 Modbus RTU 通信时,可通过状态机配合定时器实现多个数据帧的轮询发送,类似 Swap 的周期性切换逻辑[^2]。 ```scl CASE State OF 0: // 发送第一个数据帧 Send_P2P(..., pDest:=ADR(DataFrame1)); 1: // 发送第二个数据帧 Send_P2P(..., pDest:=ADR(DataFrame2)); END_CASE; ``` 这种机制在工业现场中被广泛用于多设备轮询读写操作。 --- ### 配置指南 #### 1. 硬件配置 在 TIA Portal 中配置 S7-1500 设备时,需根据实际使用的通信接口(如 RS485、Ethernet)选择相应的模块,并设置波特率、校验位、停止位等参数。对于自由口通信,还需启用“Freeport Mode”并设定数据格式。 #### 2. 程序组织单元(POU)设计 建议将 Swap 操作封装在函数块(FB)或函数(FC)中,以便复用。例如,定义一个用于交换两个整型变量的函数: ```scl FUNCTION_BLOCK FB_SwapInt VAR_INPUT IN1 : REF_TO INT; IN2 : REF_TO INT; END_VAR VAR_TEMP temp : INT; END_VAR temp := IN1^; IN1^ := IN2^; IN2^ := temp; ``` 调用示例: ```scl FB_SwapInt(IN1:=ADR(a), IN2:=ADR(b)); ``` 这种方式避免了按值传递带来的副作用问题,类似于 C 语言中使用指针实现的 Swap 函数[^4]。 --- ### 注意事项 - 对于并发访问的全局变量,在多线程或中断服务程序中应考虑使用原子操作或互斥锁,以防止数据竞争问题。CAS(Compare-and-Swap)算法可用于无锁编程环境中实现高效同步[^3]。 - 在使用自由口通信时,CRC 校验码的计算必须准确,否则会导致通信失败。可参考相关 CRC16 计算函数实现可靠的数据传输。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值