c语言问题,啥叫引用啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言问题,啥叫引用啊?相关的知识,希望对你有一定的参考价值。

引用(reference)是c++对c语言的重要扩充。
  一、引用的概念
  引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。
  例如: Point pt1(10,10);
  Point &pt2=pt1; 定义了pt2为pt1的引用。通过这样的定义,pt1和pt2表示同一对象。
  需要特别强调的是引用并不产生对象的副本,仅仅是对象的同义词。因此,当下面的语句执行后:
  pt1.offset(2,2);
  pt1和pt2都具有(12,12)的值。
  引用必须在定义时马上被初始化,因为它必须是某个东西的同义词。你不能先定义一个引用后才
  初始化它。例如下面语句是非法的:
  Point &pt3;
  pt3=pt1;
  那么既然引用只是某个东西的同义词,它有什么用途呢?
  下面讨论引用的两个主要用途:作为函数参数以及从函数中返回左值。
  二、引用参数
  1、传递可变参数
  传统的c中,函数在调用时参数是通过值来传递的,这就是说函数的参数不具备返回值的能力。
  所以在传统的c中,如果需要函数的参数具有返回值的能力,往往是通过指针来实现的。比如,实现
  两整数变量值交换的c程序如下:
  void swapint(int *a,int *b)
  
  int temp;
  temp=*a;
  a=*b;
  *b=temp;
  
  使用引用机制后,以上程序的c++版本为:
  void swapint(int &a,int &b)
  
  int temp;
  temp=a;
  a=b;
  b=temp;
  
  调用该函数的c++方法为:swapint(x,y); c++自动把x,y的地址作为参数传递给swapint函数。
  2、给函数传递大型对象
  当大型对象被传递给函数时,使用引用参数可使参数传递效率得到提高,因为引用并不产生对象的
  副本,也就是参数传递时,对象无须复制。下面的例子定义了一个有限整数集合的类:
  const maxCard=100;
  Class Set
  
  int elems[maxCard]; // 集和中的元素,maxCard 表示集合中元素个数的最大值。
  int card; // 集合中元素的个数。
  public:
  Set () card=0; //构造函数
  friend Set operator * (Set ,Set ) ; //重载运算符号*,用于计算集合的交集 用对象作为传值参数
  // friend Set operator * (Set & ,Set & ) 重载运算符号*,用于计算集合的交集 用对象的引用作为传值参数
  ...
  
  先考虑集合交集的实现
  Set operator *( Set Set1,Set Set2)
  
  Set res;
  for(int i=0;i<Set1.card;++i)
  for(int j=0;j>Set2.card;++j)
  if(Set1.elems==Set2.elems[j])
  
  res.elems[res.card++]=Set1.elems;
  break;
  
  return res;
  
  由于重载运算符不能对指针单独操作,我们必须把运算数声明为 Set 类型而不是 Set * 。
  每次使用*做交集运算时,整个集合都被复制,这样效率很低。我们可以用引用来避免这种情况。
  Set operator *( Set &Set1,Set &Set2)
   Set res;
  for(int i=0;i<Set1.card;++i)
  for(int j=0;j>Set2.card;++j)
  if(Set1.elems==Set2.elems[j])
  
  res.elems[res.card++]=Set1.elems;
  break;
  
  return res;
  
  三、引用返回值
  如果一个函数返回了引用,那么该函数的调用也可以被赋值。这里有一函数,它拥有两个引用参数并返回一个双精度数的引用:
  double &max(double &d1,double &d2)
  
  return d1>d2?d1:d2;
  
  由于max()函数返回一个对双精度数的引用,那么我们就可以用max() 来对其中较大的双精度数加1:
参考技术A C语言没有引用啊,C++才有.

引用能起到指针的部分作用,但是比指针安全.

一个引用可以看作是某个变量的一个"别名"。对引用进行操作就像对原变量进行操作一样。

主要用于函数的参数传递时使用。因为C语言没有类似VB的“传引用调用”这个功能,所以C++的引用填补了这个空白。从此即使需要改动参数,也直接传递一个变量过去即可。这在操作符重载中有更重要的意义。等你学到以后才会明白。

int a; //声明变量a
int& ra = a; //声明一个引用,名字是ra,ra引用了a

注意,ra声明的时候必须同时给出它到底引用了谁
int& ra; //只声明不指明是不对的。

还有,引用一旦声明,就不能再修改到其他变量上了,这与指针不同。
ra = b; //这是不行的,因为已经int &ra = a了
参考技术B 你们能不能能给楼主一个自己的看发?
引用,是C++的内容,他是在C语言指针的基础上优化得来的,说到引用就不得不说到C中指针的缺点,因为指针可以指向任意的内存单元包括系统所在的内存,如果指针恰好指在系统的内存位置,那么一旦你给该指针赋值了那么系统就会面临崩溃,所以用指针要很小心,很多程序方面的专家建议取消指针,但指针的优点确实是很可观的,因此为了解决这个问题,引用就诞生了,引用就等于给变量起了另一个名字,这样你在用引用名的时候就等于在使用该变量本身,引用实际上也是地址传递,因为引用名和变量用的是同一个内存。
不知道这样说楼主能否理解!
参考技术C 引用简介
  引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。
  引用的声明方法:类型标识符 &引用名=目标变量名;
  【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名
  说明:
  (1)&在此不是求地址运算,而是起标识作用。
  (2)类型标识符是指目标变量的类型。
  (3)声明引用时,必须同时对其进行初始化。
  (4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
  ra=1; 等价于 a=1;
  (5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。
  (6 ) 不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名.
  (7)不能建立引用的引用,不能建立指向引用的指针。因为引用不是一种数据类型,所以没有引用的引用,没有引用的指针。
  例如:
  int n;
  int &&r=n;//错误,编译系统把"int &"看成一体,把"&r"看成一体,即建立了引用的引用,引用的对象应当是某种数据类型的变量
  int &*p=n;//错误,编译系统把"int &"看成一体,把" *p "看成一体,即建立了指向引用的指针,指针只能指向某种数据类型的变量
  (8)值得一提的是,可以建立指针的引用
  例如:
  int *p;
  int *&q=p;//正确,编译系统把" int * "看成一体,把"&q"看成一体,即建立指针p的引用,亦即给指针p起别名q。
  注意:学会这种分析方法,把什么看成一体,又把什么看成一体

西门子PLC中啥叫PID指令啊?

请问有谁能告诉我PID指令是什么意思?

PID(比例+积分+微分)算法控制。

PID回路指令,对模拟量进行PID控制十分方便。PID指令使用的算法:( n SP 为第n个采样时刻的给定值,n为过程变量值,MX 为积分项值)PID 指令根据表格(TBL)中的输入和配置信息对引用LOOP执行PID 循环计算。

在实际控制过程中,无论是给定量还是过程量都是工程实际值,它们的取值范围都是不相同的。因此在进行PID运算前,必须将工程实际值标准化。PLC 在对模拟量进行PID运算后,对输出产生的控制作用是在[0.0,1]范围的标准值,不能驱动实际的驱动装置,必须将其转换成工程实际值。

扩展资料

PID的特点

1、PID应用范围广

虽然很多工业过程是非线性或时变的,但通过对其简化可以变成基本线性和动态特性不随时间变化的系统,这样PID就可控制了。

2、PID参数较易整定

也就是,PID参数Kp,Ti和Td可以根据过程的动态特性及时整定。如果过程的动态特性变化,例如可能由负载的变化引起系统动态特性变化,PID参数就可以重新整定。

3、PID控制器在实践中也不断的得到改进

PID在控制非线性、时变、耦合及参数和结构不确定的复杂过程时,工作得不是太好。最重要的是,如果PID控制器不能控制复杂过程,无论怎么调参数都没用。

参考资料来源:百度百科—PID控制

参考技术A PID指比例积分微分,Proportion比例,Integration积分,Differentiation微分
西门子PLC编程软件中有PID向导,程序中的PID程序块可利用s7-Micro/win程序中的“工具”→“指令向导”生成。根据向导的提示可以对死区、报警、手动等功能进行选择,可以对设定范围、P、I、D等参数进行设定(完成后还可以利用向导进行更改)。根据提示完成设定后会自动生成一个子程序和一个中断程序,在主程序或其他程序中调用PID子程序就可以实现PID调节功能。需要更详细的说明可以直接察看编程软件的帮助文档,那里说明的还是比较详细的。

PID控制说明:
在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。PID控制器问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。PID控制,实际中也有PI和PD控制。PID控制器就是根据系统的误差,利用比例、积分、微分计算出控制量进行控制的。

比例(P)控制 :比例控制是一种最简单的控制方式。其控制器的输出与输入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差。

积分(I)控制 :在积分控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统。为了消除稳态误差,在控制器中必须引入“积分项”。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。因此,比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。

微分(D)控制 :在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。 自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。其原因是由于存在有较大惯性组件(环节)或有滞后组件,具有抑制误差的作用,其变化总是落后于误差的变化。解决的办法是使抑制误差的作用的变化“超前”,即在误差接近零时,抑制误差的作用就应该是零。这就是说,在控制器中仅引入“比例”项往往是不够的,比例项的作用仅是放大误差的幅值,而目前需要增加的是“微分项”,它能预测误差变化的趋势,这样,具有比例+微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例+微分(PD)控制器能改善系统在调节过程中的动态特性。

西门子PID各参数的解释
COM_RST :=初试化
MAN_ON :=手动
PVPER_ON:=过程变量外设接通
P_SEL :=比例分量接通
I_SEL :=积分分量接通
INT_HOLD:=积分分量保持
I_ITL_ON:=积分分量初始化接通
D_SEL :=微分分量接通
CYCLE :=采样时间
SP_INT :=内部设定值
PV_IN :=过程变量输入
PV_PER :=过程变量外设输入
MAN :=手动值
GAIN :=比例增益
TI :=复位时间
TD :=微分时间
TM_LAG :=微分分量的滞后时间
DEADB_W :=死区宽度
LMN_HLM :=被控量上限
LMN_LLM :=被控量下限
PV_FAC :=过程变量系数
PV_OFF :=过程变量偏移量
LMN_FAC :=被控量系数
LMN_OFF :=被控量偏移量
I_ITLVAL:=积分分量初始值
DISV :=干扰变量
LMN :=被控量
LMN_PER :=被控量外设
QLMN_HLM:=被控量上限值到达
QLMN_LLM:=被控量下限值到达
LMN_P :=比例分量
LMN_I :=积分分量
LMN_D :=微分分量
PV :=过程变量
ER :=误差信号本回答被提问者采纳
参考技术B 好像是s_otd吧?这个是西门子的延时接通计时器指令,一般都是指令上测都是填t1-t255,不能是别的
预设值时间应该是s5#time
2s等格式的。一般在多重调用的功能块是不能用这个指令的,都用ton(库文件里边的)。因为这个是系统固有的定时器,好像只有255个!慎用!!
参考技术C 您是不懂PID的含义吗?
PID是一种闭环控制方式。P代表比例调节,影响系统的快速性;I代表积分调节,消除系统的稳态误差;D代表微分调节,对系统的状态有一个预测的作用(一般不用,条不好的话会造成系统震荡)。
我不知道您说的PLC是S7-300吗?它是调用FB41实现PID的。
希望我的解释对您有所帮助 !

以上是关于c语言问题,啥叫引用啊?的主要内容,如果未能解决你的问题,请参考以下文章

在C语言编程中啥叫前导空格,啥叫尾随空格

C语言里面啥叫调试?

C语言中啥叫死循环?怎么避免?

C语言中啥叫内存泄露?

C语言中啥叫调用函数?为啥函数和函数之间是调用关系?

c语言结构体变量怎么比较大小假设p,e都是如下类型的结构体变量?