指针

指针变量就是保存地址的变量

int i;
int*p=&i;
int *q;
q=p;//指针p和q都指向了i,修改*p或者*q都可以改变量i的值

一般形式:    类型名   *指针变量名;

  • 类型名指定指针变量所指向变量的类型
  • 指针声明符*在定义指针变量时被使用,说明被定义的那个变量是指针
  • 一旦指针被定义并赋值后,就可以如同其他类型变量一样赋值运算,如*p和*q可以p=q;
  • p里面的值就是i的地址,就称为p指向了i

变量的值是内存的地址

  • 普通变量的值是实际的值
  • 指针变量的值是具有实际值的变量的地址

作为参数的指针:

  • void f(int *p);在被调用的时候,得到某个变量的地址
  • int i=0;    f(&i);在函数里面可以通过这个指针访问外面的这个i
#include<stdio.h>void f(int *p);int main(void)
{int i=6;printf("&i=%p\n",&i);f(&i);//输入i的地址 printf("i=%d\n",i);return 0;
}void f(int *p)//定义一个指针变量
{printf("p=%p\n",p);//此时p为i的地址 printf("*p=%d\n",*p);//此时*p为i的值 *p=26;//指针变量将26赋回i里面
}
//
&i=000000000065FE1C
p=000000000065FE1C
*p=6
i=26

*p即是等于i(等于所指向的变量的值),p即是i的地址(等于指向的变量的地址)

*是一个单目运算符,用来访问指针的值所表示的地址上的变量

可以做右值也可以做左值:    int k=*p             *p=k+1

指针的使用

  • 指针应用场景一:在函数里面交换两个变量的值
swap(&a,&b);void swap(int *a,int *b)
{int t=*a;*a=*b;*b=t;
}
  • 指针应用场景二:函数需要返回多个值,某些值只能通过指针返回(场景一同理)

传入的参数实际上是需要保存带回的结果的变量

PS:指针没有得到变量的地址之前不能使用

指针,数组和地址间的关系:

  • 数组名本身是一个地址,即是指针值,但数组是指针常量,而不是变量。因此不能出现对数组a[]的a赋值
  • 由于a+i是距数组a的基地址的第i个偏移,所以*(a+i)与a[i]等价

由此可见,数组名可以使用指针形式,而指针变量可以转换为数组形式

  • a[]是变量,a是指针,*p是被指向变量,p是指针。
  • 指针得到变量的地址方式:*p=&变量或p=指针或p=a[0]
  • f(a)=f(&a[0])后者传入数组首地址进入函数,函数里面有了a[0]的地址。因为数组的地址是连续的,需要a[1]时,对a+1即得
#include<stdio.h>int f(int a[])//定义了一个指针 ,a[]等价*a等价a[9]
{int i;for(i=0;i<9;i++){printf("%d\n",a[i]);}return 0;
} int main(){int a[9]={0};a[1]=3;//a[]是变量的值 ,a是指针 f(a);//等价于f(&a[0]);}
int a[100],*p;p=a;//将数组(指针常量)a[0]的地址赋给*p
p=&a[0];//与上式等价//等价
p=a+1;
p=&a[1];
p++;

当指针加上const时:

  • const在 * 后面,表示该指针得到了某个变量的地址,不能再指向其他变量,但可以修改该变量值

例:int * const q=&i;表示指针q固定指向i,不能q++或*q=&a,

  • const在 * 前面,表示不能通过这个指针去修改被指向的变量,但可以修改指向其他变量

例:const int *q=&i;不能*p=26,但可以i=26

const int a[]={1,2,3,4,5,6},数组变量已经是const的指针,必须通过初始化进行赋值

  • 保护数组值:数组传入函数时传递的是地址,因此函数可以修改该数组的值

int f(const int a[] );给数组加上const,数组便是不可修改的状态,以保护数组不被函数破坏

指针运算:

  • 给一个指针加1表示要让指针指向下一个变量
int a[10];
int *p=a;
*(p+1)-----a[1]

注意:如果指针不是指向一片连续分配的空间(数组),则这种运算没有意义

  • 指针加减(+,+=,-,-=)
  • 递增递减(++/--)      *p++表达:先取出p所指的数据,完事之后再把p移到下一个位置去
  • 两个指针相减,求出两个地址之间能放多少个相同类型的值
  • 指针比较<,<=,==,>,>=,!=      比较它们在内存中的地址

0地址:

当然你的内存中有0地址,但是0地址通常是个不能随便碰的地址

*p=NULL;或者*p=0;(有的编译器不认0为0地址)

用0地址表示特殊的事情:

  • 返回的指针是无效的
  • 指针没有被真正初始化(先初始化为0)

指针的类型:

  • 无论指向什么类型,所有的指针大小都是一样的
  • 指向不同类型的指针是不能直接互相赋值的,为了避免用错指针
  • 但可以做指针的类型转换:

int *p=&i;   boid*q=(void*)p;        这并没有改变p所指的变量i的类型,而是让后人用不同的眼光通过p看i

PID控制系统

比例控制P

控制量与误差成正比

可以减小误差,产生响应速度和力度,过小响应慢,过大会产生振荡,造成稳态误差

积分控制I

累计误差并直接加到控制量上(积分误差函数),提供了一定的惯性

在系统误差和外力作用时消除偏差、提高精度,同时也会增加响应速度,产生过冲,过大会产生振荡

微分控制D

计算当前误差的变化率并加至控制量,提供一定的阻尼提高抗干扰性

抑制过冲和振荡,过小系统会过冲,过大会减慢响应速度,另一作用为抵抗外界的突发干扰,阻止系统的突变。

微分调解检测的是瞬时信号,D对高频信号有放大作用

先调整P,从小到大

再调整I,最后可以微量加一点D以平稳曲线

C语言学习(指针)+PID系统相关推荐

  1. sdh管理单元指针_C语言学习|指针的介绍

    指针是C语言提供的一种特殊而又有非常重要的数据类型. 联合使用指针和结构体这两种数据类型可以有效地表示许多复杂的数据结构,如队列.堆栈.链表.树.图等. 指针这个内容为什么那么的重要? 1.指针为函数 ...

  2. 学习C语言-学习指针

    <p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/LearnC" f ...

  3. c语言学习02指针总结

    本人工作Android开发越往高深方向专业,就越发现c语言的重要性.可以说java是简单的封装语言,但大量封装起来的不灵活,而Android的自带的java代码往往有些功能并不完美,这就导致高级开发就 ...

  4. c语言中否则指令不能用,C语言学习笔记

    此文章为个人学习时记录笔记,顺便试试MarkDown,不是教程-. C语言学习笔记 Mac系统的使用 Finder 文件管理系统 Dock 快捷栏 系统偏好设置 Safari浏览器 App Store ...

  5. c语言中指针的类型,学习C语言中的指针类型

    摘要:结合我院学生十年来参加全国计算机等级考试(C语言部分)情况,通过分析成绩分布与题型关系,我们发现指针方面的题型失分率最高.在此基础上结合教学实际,本文提出学习指针知识的方法和顺序过程,并将其应用 ...

  6. linux系统C语言学习总结

    引言 尽管 C 语言问世已近 30 年,但它的魅力仍未减退.C 语言继续吸引着众多的开发者,他们为了编写.移植或维护应用程序而必须学习新技能. 本文是为了满足对C语言初学者或想提高自身C语言修为的开发 ...

  7. C语言 指针 规范,C语言学习知识指针习题集附规范标准答案.doc

    C语言学习知识指针习题集附规范标准答案.doc /*一.选择题1. 变量的指针,其含义是指该变量的_________. a值 b地址 c名 d一个标志2若有语句int *point,a4;和point ...

  8. C语言学习笔记10-指针(动态内存分配malloc/calloc、realloc、释放free,可变数组实现;Tips:返回指针的函数使用本地变量有风险!;最后:函数指针)

    C语言:指针 1. 指针:保存地址的变量 *p (pointer) ,这种变量的值是内存的地址.   取地址符& 只用于获取变量(有地址的东西)的地址:scanf函数-取地址符   地址的大小 ...

  9. Linux系统下的C语言学习

    学习目标: C Learning- C语言的优点 C语言的缺点 打印C语言的特点 学习内容: 前言 C语言的优点 1. C语言简洁.紧凑.灵活 C语言的核心内容很少,只有32个关键字,9种控制语句:程 ...

  10. 51 时间片系统 纯c语言,51单片C语言学习.doc

    51单片C语言学习 51单片机C语言学习第三课 [ 作者:明浩????转贴自:电子制作实验室????点击数:1067????更新时间:2004-10-2????文章录入:admin ]减小字体 增大字 ...

最新文章

  1. juery mobile select下来菜单选项提交form问题
  2. 11旋转编码器原理图_plc编程入门:浅谈编码器的工作原理!
  3. Nginx教程系列四:实现反向代理配置
  4. 在表格中批量显示图片
  5. MySQL查询不到中文的问题
  6. 经典面试题(51):以下代码将输出的结果是什么?
  7. BZOJ2460: [BeiJing2011]元素(线性基+贪心)
  8. (转载) AT指令详解
  9. python使用os.system()方法进行多模块安装
  10. tf.nn的conv2d卷积与max_pool池化
  11. Android8.1 MTK平台 SystemUI源码分析之 Notification流程
  12. 若已知1800年1月1日为星期3,则对于一个给定的年份和月份,输出这个月的最后一天是星期几。
  13. esp8266+arduino+网页配网+温湿度上传+温度控制开关+eeprom永久保存+微信小程序控制
  14. Contradiction Detection with Contradiction-Specific Word Embedding
  15. 数据类型的转换与运算
  16. 3000字告诉你如何渡过程序员菜鸟时期
  17. WPS如何生成指定区间随机数
  18. 面试题:25匹马最快3匹及扩展
  19. Microsoft 解决方案框架版本 3.0 概述
  20. 关于无法进入XP系统的解决方法

热门文章

  1. sap一个项目如何对应多个服务器,SAP ERP连接多台PI系统配置
  2. excel打开html非常慢,解决EXCEL表格打开缓慢,文件异常臃肿庞大
  3. 中软培训第一周复习总结 --简单的HTML 与CSS
  4. 中软实习培训记录十一(0731)
  5. 几步教你如何做一个赚钱的自媒体账号,昨天我赚了469
  6. flutter 文本上下角标显示,如角度、温度
  7. Java程序员系列——程序员必须认识的英文单词(汇总)
  8. ubuntu ibus
  9. snmp v3 参数_snmp++开发snmpv3注意事项
  10. 使用Python生成Micro QRCode(微二维码)