基础7---关于指针

c语言提供的指针能够对内存直接进行操作,就像另一种操作位运算一样,可以大大提高程序的运行效率。现在归纳总结几点以便日后看。

1.指针是用来存放对象地址的变量,而地址是指针常量,不能进行赋值等对于变量的运算。

eg.使用指针方式将两个数按先小后大的顺序输出


#include <stdio.h>
int main()
{
    int a, b,*p1, *p2, *p;
    p1 = &a, p2 = &b;
    scanf("%d%d",&a, &b);
    if(*p1>*p2)
    {
        p= p1;
        p1= p2;
        p2 = p;
    }
    printf("a=%d b=%d\n",a, b);
    printf("Min is:%d   Max is:%d\n",*p1, *p2);
    return 0;
}


2.关于指针的运算

int a=100,*p=&a;

①(*p)++:等价于a++,运算执行后p值不变;

②*p++:按照运算符优先级,等价于*(p++),运算后表达式的值为a,p指向下一个int型内存单元:

③*++p:按照运算符优先级,等价于*(++p),p先指向下一个int型单元,表达式再引用这个内存单元的值;

④两指针的相减运算:设p1, p2是同一个指向类型的两个指针(常量或变量),则p2-p1的结果为两个指针之间对象的个数;



3.指针与一维数组:

eg.用多种方法遍历一维数组元素

这是地址引用法

#include <stdio.h>
int main()
{
    int a[10], i;
    for(i=0;i<10;i++)
        scanf("%d",a+i);
     for(i=0;i<10;i++)
        printf("%d ",*(a+i));
     return 0;
}

下面通过指向数组的指针变量简介访问元素


#include <stdio.h>
int main()
{
    int a[10], *p;
    for(p=a;p<a+10;p++)
        scanf("%d",p);
    for(p=a;p<a+10;p++)
        printf("%d ",*p);
    return 0;
}

后者比前者方法快,因为指针变量直接指向数组元素,不必每次重新计算元素地址。类似于p++的自增运算快于加法运算,大大提高了数组元素的访问效率。



4.指向多维数组元素的指针。

本质上,c语言将多维数组当成一维数组来处理。

1>地址辨析

在二维数组a[i][j]中,a[i]和*(a + i)是等价的,代表第i行元素的首地址;

&a[i]和a+i是等价的,代表第i行的地址;

a[i] 和*(a + i)不一定是元素,这个结论可推广到N为数组的情况。

2> int a[N][M], *p = &a[0][0]

访问一个二维数组元素a[i][j],可以用:

①数组下标法 a[i][j];

②指针下标法 p[i*M+j];

③地址引用法 *(*(a+i)+j)或*(a[i] + j)

④指针引用法  *(p +i*M+j);


eg.通过指针遍历二维数组


#include <stdio.h>
int main()
{
    int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12},*p;
    for(p =a[0];p<a[0]+12;p++)
        {
        printf("%2d ",*p);
        if((p-a[0])%4== 3)
        printf("\n");//每行输出四个元素后换行
        }
     return 0;
}



5.数组指针:C语言可以定义一个指针变量,其指向类型是一个数组,称为数组指针。


声明如下:

int a[3][4], (*p2)[4];

p2=a;//p2指向一个有四个整型元素的一维数组。


eg.通过指向一维数组的指针遍历二维数组的值


#include <stdio.h>
int main()
{
    int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
    int (*p)[4]=a;
    for(int i=0;i<3;i++)
        {for(int j=0;j<4;j++)
        printf("%2d",p[i][j]);
        printf("\n");}

     return 0;
}


6.指向字符数串组的指针

1>%s输出时参数必须为字符串地址。

2>使用字符指针数组,各个字符串按实际长度存储,指针数组元素只是各个字符串的首地址,不存在浪费内存单元问题。



给定一个整数num,( 1<=num<=3999),将整数转换成罗马数字。

如1,2,3,4,5对应的罗马数字分别位I,II,III,IV,V等。

格式:

   第一行输入一个整数,接下来输出对应的罗马数字。

提示:

   罗马数字的常识见此链接,对做题有帮助哦~尤其是表示方法。

http://baike.baidu.com/link?url=injU8M4bAoc2zRZQ1GtgrfvuzCJO9PLnq6fpQGJLenakbzo-rS8p-qsYHR_81-aN


样例输入

123

样例输出

CXXIII




#include <stdio.h>
void trans_toRoman(int num)
{
     char *roman[][10]={"","I","II","III","IV","V","VI","VII","VIII","IX",
        "","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",
        "","C","CC","CCC","CD","D","DC","DCC","DCCC","CM",
        "","M","MM","MMM"};
    int i=10000,j=0,n;
    for(j=0;j<4;j++)
       {
        n=(num%i)/(i/10);
        i/=10;
        printf("%s",roman[3-j][n]);
       }
    printf("\n");
}
int main()
{
    int n;
    char* roman;
    scanf("%d", &n);
    if(n < 1 || n > 3999)
    {
       printf("ERROR NUMBER!\n");
    }
    trans_toRoman(n);
    return 0;
}



②给出一个数字,打出相应星期的英文






#include<stdio.h>
char *day_name(int n){
	char *name[]={ "Illegal day",
                    "Monday",
                    "Tuesday",
                    "Wednesday",
                    "Thursday",
                    "Friday",
                    "Saturday",
                    "Sunday"};
	return ((n<1||n>7) ? name[0] : name[n]);
}

int main(){
	int i;
	scanf("%d",&i);
	printf("Day No:%2d-->%s\n",i,day_name(i));
	return 0;
}

 


先到这里,指针的东西还很多,日后再续!



欧姆龙FINS(工厂集成网络系统)协议是专为该公司自动化设备间数据交互而设计的网络通信标准。该协议构建于TCP/IP基础之上,允许用户借助常规网络接口执行远程监控、程序编写及信息传输任务。本文档所附的“欧ronFins.zip”压缩包提供了基于C与C++语言开发的FINS协议实现代码库,旨在协助开发人员便捷地建立与欧姆龙可编程逻辑控制器的通信连接。 FINS协议的消息框架由指令头部、地址字段、操作代码及数据区段构成。指令头部用于声明消息类别与长度信息;地址字段明确目标设备所处的网络位置与节点标识;操作代码定义了具体的通信行为,例如数据读取、写入或控制器指令执行;数据区段则承载实际交互的信息内容。 在采用C或C++语言实施FINS协议时,需重点关注以下技术环节: 1. **网络参数设置**:建立与欧姆龙可编程逻辑控制器的通信前,必须获取控制器的网络地址、子网划分参数及路由网关地址,这些配置信息通常记载于设备技术手册或系统设置界面。 2. **通信链路建立**:通过套接字编程技术创建TCP连接至控制器。该过程涉及初始化套接字实例、绑定本地通信端口,并向控制器网络地址发起连接请求。 3. **协议报文构建**:依据操作代码与目标功能构造符合规范的FINS协议数据单元。例如执行输入寄存器读取操作时,需准确配置对应的操作代码与存储器地址参数。 4. **数据格式转换**:协议通信过程中需进行二进制数据的编码与解码处理,包括将控制器的位状态信息或数值参数转换为字节序列进行传输,并在接收端执行逆向解析。 5. **异常状况处理**:完善应对通信过程中可能出现的各类异常情况,包括连接建立失败、响应超时及错误状态码返回等问的处理机制。 6. **数据传输管理**:运用数据发送与接收函数完成信息交换。需注意FINS协议可能涉及数据包的分割传输与重组机制,因单个协议报文可能被拆分为多个TCP数据段进行传送。 7. **响应信息解析**:接收到控制器返回的数据后,需对FINS响应报文进行结构化解析,以确认操作执行状态并提取有效返回数据。 在代码资源包中,通常包含以下组成部分:展示连接建立与数据读写操作的示范程序;实现协议报文构建、传输接收及解析功能的源代码文件;说明库函数调用方式与接口规范的指导文档;用于验证功能完整性的测试案例。开发人员可通过研究这些材料掌握如何将FINS协议集成至实际项目中,从而实现与欧姆龙可编程逻辑控制器的高效可靠通信。在工程实践中,还需综合考虑网络环境稳定性、通信速率优化及故障恢复机制等要素,以确保整个控制系统的持续可靠运行。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值