当前位置: 首页 > news >正文

电子商务网站策划书布局设计千万不要嫁给程序员

电子商务网站策划书布局设计,千万不要嫁给程序员,医院网站开发违法吗,软件推广是什么工作文章转自#xff1a;无际单片机大家好#xff0c;我是无际。今天给大家来讲解一下指针。我会由浅到深#xff0c;最后结合实际应用讲解#xff0c;让大家学会指针的同时#xff0c;知道大佬们都用指针来干嘛#xff01;长文预警#xff01;全文大约5200多字#xff0c;… 文章转自无际单片机大家好我是无际。今天给大家来讲解一下指针。我会由浅到深最后结合实际应用讲解让大家学会指针的同时知道大佬们都用指针来干嘛长文预警全文大约5200多字学指针看这篇文章就够了很多人跟我刚学习c语言一样都害怕指针。我也是后面做了一些物联网网关才知道指针是c语言的灵魂这句话真正含义。没有指针很多功能实现起来确实很不方便比如做不到真正的模块化编程。Ok废话不多说下面正式进入主题。一、通过这篇文章你能掌握以下知识指针的相关概念掌握指针与数组之间的关系掌握指针指向的指针掌握如何使用指针变量做函数参数掌握如何使用指针函数掌握如何使用指针数组函数那么这篇文章对应有视频教程如果不喜欢看文章的可以去看视频教程在小破站可以搜无际单片机编程找到也可以找我们拿。二、指针的作用指针是C语言中一个比较重要的东西有人说指针是C语言的灵魂这句话说的一点也没错。正确灵活地运用它可以有效地表达一些复杂的数据结构比如系统的动态分配内存、消息机制、任务调度、灵活矩阵定时等等。掌握指针可以使你的程序更加简洁、紧凑、高效。那么在单片机领域如果是做稍微大一点的项目需要把每个功能做成模块化硬件驱动层和应用层分别独立运行。即使更换单片机型号也不用修改应用层程序即移植性非常强这些都离不开指针。甚至没指针会很难实现即使实现代码的可移植性也很差。三、指针的概念前面讲了指针的作用这里再强调一点指针是一把双刃剑。用好了能十分灵活而且提高程序的效率但是如果使用不当则会出现程序”死机”等致命问题。而这些问题往往是由于错误地使用指针而造成的最常见的就是内存溢出错误指针指向未知地址。1.地址与指针指针是一个比较抽象的概念如果想真正了解指针那么要先从数据是如何存储的说起我们通过一个图来看一下数据在内存里存储的情况。在这个图中都是以16进制显示。红色标注的0x00000400代表地址内存地址绿色3730代表数据而橙色标注的00 01代表地址递增量即代表0x00000400和0x00000401每个地址存储1个字节数据。那么我们把这个图看作是数据在内存里的存储形式0x00000400这个内存地址存储着数据370x00000401这个内存地址存储着数据30。当我们在程序里定义一个字节的变量那么在编译器编译时就会给这个变量分配一个这样的内存地址来存储。假设我们定义以下变量unsigned char a;a 0x37;对应这个图就是编译器在编译时会为变量a分配一个字节的内存空间并把0x37这个数据存储进去并将变量名a改成地址0x00000400以便CPU的访问。通过这个地址就能找到变量a数据的存储位置而这个地址0x00000400其实就是指针通过这个指针可以访问变量a的数据。2.指针变量通过上面讲解我们明白了通过地址能访问内存的数据这个地址啊就是指针。那么指针和指针变量呢是不一样的概念大家一定要记住了。指针是概念、指针变量是这个概念的具体应用之一我们先来看一下C语言里怎么定义指针变量。指针变量定义的一般形式变量类型 *变量名unsigned char *p;通过这种语法我们就能够定义一个指针变量p。指针变量赋值指针和指针变量是两个概念指针变量跟普通变量一样在使用前一定要定义和赋值(指向地址)。给指针变量赋的值和普通变量不同给指针变量赋值只能赋地址而不能赋予其他任何值否则会引起错误。那么怎么获取普通变量的地址呢在C语言里可以使用””来获取普通变量的地址一般用以下格式来表示:变量名那么通过变量名取得变量地址后就可以赋值给指针变量。举例: unsigned char a; unsigned char *p int main() {       p a; }这个代码里我们定义了一个变量a, 定义了一个指针变量p。我们通过运算符把变量a的内存地址赋值给变量p所以p指向了变量a的内存存储地址。上面说了指针变量赋值的问题那么怎么获取和改变指针变量指向那个内存地址的数据呢我们可以通过*指针变量 数值如*p 10;这样的操作可以改变指针变量指向那个内存地址的数据。通过:a *p;来获取指针变量指向那个内存地址的数据。下面我们通过一个代码实验来举例。这里我们定义了变量a和指针变量p然后a的值初始化为10。把a的地址赋值给指针变量p接着我们输出a的地址是0x60ff33。由于前面我们把a的地址赋值给了指针变量p所以p指向的地址也是0x60ff33。那么我们再来看一下指针变量的在内存里的存储地址是0x60ff2c。所以大家这里要注意了我们定义指针变量时即便指针变量是指向地址用的但是编译器也会分配一块内存地址来存储指针变量。我们接着来看下变量a的输出值。a10, *p是获取指针指向内存地址的数据所以也是10。下面就是通过指针变量来改变变量a的值因为指针变量p指向的是变量a的地址所以改变指针变量p指向内存地址的数据就可以改变变量a的值。那么通过这么原理我们是不是不用指针变量也不用a等于多少来改变a的值呢当然可以我们看下面通过内存地址改变变量a的值我们前面知道a的地址是0x60ff33那我们可以直接写0x60ff3312来改变变量a的值。当然这里要注意编译器编译时并不知道0x60ff33是什么东西所以要把这个整形地址转换成指针类型。最后通过*地址语法改变这个地址里面的数据。我们看输出结果可以发现a的值已经成功被改成了12。其实通过指针变量改变某个内存地址的数据就是这个原理但是指针变量好处可以任意起名字。也不用像这样先把变量a的地址读出来然后通过地址去改变它的值用起来就很方便所以通过指针变量来替代了这种做法。四、数组与指针一般系统或编译器会分配连续地址的内存来存储数组里的元素如果把数组地址赋值给指针变量那么就可以通过指针变量来引用数组读写数组里的元素了。我们来做个实验从这个代码来看定义了一个数组buff并初始化为12345。定义了2个指针变量p1和p1分别指向buff, buff[0]。buff默认的是数组下标为0元素的存储地址。所以这里buff和buff[0]是同一个内存地址只是写法不一样。我们从输出结果可以看的出来数组和指针变量的地址都是一样的所以大家用这几种写法都是可以的。那么我们来看下输出结果都是1说明操作是对的。指针自加自减运算指针变量除了可以用来获取内存地址的值以外还可以用来进行加减运算。但是这个加减呢跟普通变量加减不一样普通变量加减的是数值而指针变量加减的是地址我们来通过代码来讲解下。同样这里定义了数组buff并初始化为1,2,3,4,5。我们把指针变量p1指向数组第一个元素的地址即0x402000。然后我们直接看p1的操作p1后我们看到p0x402001所以指针变量的加减等运算是指向地址的运算。其他减法乘除法也是基于地址的运算。二维数组与指针通过一维数组与指针的讲解相信大家已经掌握。那么二维数组与指针的操作也是一样的, 二维数组和一维数组一样都是分配连续的地址来存储的数据的。我们还是通过一个例子来实践一下首先我们定义了一个二维数组buff和指针变量p1。p1指向二维数组的[0][0]这个元素地址这个就是为这个数组分配时的首地址。然后打印二维数组里每个元素的地址和值接着打印指针变量地址和值这些就是指针和二维数组的用法比较简单这些代码大家可以去做下实验。四、指向指针的指针一个指针变量指向整型变量或者字符型变量当然也可以指向指针变量这种指针变量用于指向指针类型变量时就称为指向指针的变量也叫双重指针。定义方法数据类型 **指针变量名例如unsigned char **p;这个含义就是定义一个指向指针的指针变量p它指向另一个指针变量我们通过代码来说明一下会更好理解一点。我们定义一个变量a, 定义一个指针变量p1定义一个双重指针变量p2然后打印这3个变量的内存地址。编译器在编译的时候呢也会为指针变量和双重指针变量分配一个存储空间。虽然指针变量是指向别的内存地址的但是变量本身还是需要一个地址空间来存储的。指针容易把人搞晕的就是指针变量本身的存储地址和指向的地址分不清楚这个是两个概念大家要记住了。下面我们通过实验来看下双重指针怎么用这里我们定义了变量a并初始化值为10指针变量p1双重指针变量p2。我们把p1指向变量ap2指向变量p1的存储地址这里要注意不是p1指针指向的地址。然后我们打印看下结果可以看到a的地址是0x404090。指针变量p1的存储地址通过运算符获得即0x4040b0p1指向a的地址所以p1也等于0x404090。所以指针变量分为存储地址和指向地址这两个是不一样的概念。而p2是双重指针p2指向p1的存储地址0x4040b0通过*p2获得0x4040b0这个地址里指向的地址0x404090即p1指向的地址或变量a的地址。再通过**p2来获取0x404090地址里的值得到10。这里还有一个问题需要注意”*”这个运算符是从右到左进行运算的。所以**p2就是*(*p2)先取指向地址再取指向地址里面存储的值。一般在单片机程序中尽量少使用这种指向指针的指针防止出现Bug的时候非常难排查目前我就在队列中使用过。五、指针变量作为函数形参一般我们都是以字符型、整型、数组等作为函数的形参带入。除此以外指针变量也可以作为形参使用而且用的非常多主要目的是为了改变指针指向地址的值专业术语是通过形参改变实参的值。我们直接写个代码来举个例子这个代码中我们定义一个SetValue函数并且形参为指针变量p1。我们调用SetValue时把a的地址赋值给形参指针变量p1。当我们通过*p15后就能把p1指向地址的值改成5所以a的值也从1变成了5。这个就是指针变量作为函数形参的一种作用。实际当中使用功能当然不会这么简单。比如说我们常用的memset库函数他的原型就是Void *memset(void *s, int ch, size_t n);这个函数的作用是给某个数组或者结构体初始化用的。那么这个函数就使用了无指定数据类型的指针变量s这样我们就可以很轻易的把实现某些功能的代码封装起来使用者不用关心功能代码的实现只需要了解函数怎么用即可。这样的话代码很简洁紧凑移植性也好这是把指针作为形参的一种作用不过这些都只是冰山一角在后面的学习当中你会慢慢发现指针的魅力和强大。六、函数指针如果在程序中定义了一个函数那么在编译时系统就会为这个函数代码分配一段存储空间这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放这个指针变量就叫作函数指针变量简称函数指针。在这个章节我们大家只要学会怎么定义和使用就行了后面章节课程我们无际单片机编程会教大家函数指针的一些实际应用。我们学东西主要还是看能运用在哪里是吧那么这个函数指针怎么定义呢我们定义函数指针的格式如下函数返回值类型 (* 指针变量名) (函数参数列表);这样就定义了一个函数指针变量func, 该函数指针返回值为unsigned char类型然后有2个形参分别是unsigned char类型。那么我们定义了这个函数指针变量以后要怎么使用呢我们写个代码来解析一下。我们看下这个代码首先我们定义一个函数指针func再定义一个加法函数add函数返回值为形参1形参2的值。然后我们把func指向加法函数add因为函数名称就是函数首地址所以我们直接funcadd就可以实现func指向add了。接着(*func)(1,2)代表执行func函数指针指向的函数所以结果等于3。函数指针func的返回参数和形参不一定要和函数add定义成一样func也可以不设置返回值或者形参但是一般不建议这样做避免引起一些不必要的错误。那么这里呢其实还有一个知识点要和大家说一下我们先来写一段代码这段代码调用函数指针的时候没有使用(*func)(1,2)这种用法也是可以的执行的效果是一样那么到底有什么区别呢其实这个是编译器实现的问题我们不用去纠结这种对我们没有意义的东西除非你想去做编译器。大家只要记住函数指针是这样用的就行了。后期应用时再把它们多练几遍以后做产品都用上那么基本就熟了而且产品的程序架构也更好了。七、函数指针数组像字符型整形都是可以单独定义也可以定义成数组同样函数指针也可以定义成数组同样这里我们不讲那么多理论上的概念直接记住怎么定义怎么使用、用在哪里就行了。函数指针数组定义格式如下函数返回值类型 (* 指针变量名[数组大小]) (函数参数列表);我们用程序表示如下这样就定义了一个可以指向3个函数的函数指针数组。定义了以后我们函数指针需要赋值赋值的意思就是让它们指向函数首地址一般初始化的方式有两种。这是第一种定义函数指针数组的时候直接初始化。这是第二种先定义然后再初始化这里我们主要是要记住它们这两种的写法就行了。函数指针数组赋值以后通过以下代码来执行。我们可以看到直接写func[0]()就可以执行函数指针数值指向的函数了。那么这种函数指针数组到底有什么用呢其实真正产品应用中函数指针数组是非常有用的。我举一个例子写控制5个LED灯亮的函数如果用传统方式流程是先要判断控制哪个LED然后再控制指定GPIO口高低电平。而函数指针只要一条语句这就是所谓的代码的简洁、紧凑的特点代码简洁紧凑以后自然也能节约cpu和内存的资源。下面是演示代码Ok终于码完了原创不易各位看官给我点个【赞】和【在看】吧爱你们哟推荐阅读专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号后台回复「1024」获取学习资料网盘链接。欢迎点赞关注转发在看您的每一次鼓励我都将铭记于心~嵌入式Linux微信扫描二维码关注我的公众号
http://www.sadfv.cn/news/5775/

相关文章:

  • 保洁公司 网站模板威海网站建设吧
  • discuz网站同步秦皇岛软件开发培训
  • 手机百度屏蔽我网站关键词wordpress问题
  • 百度免费网站申请医疗器械公司排名
  • 网站文件权限设置遵义信息网
  • 合肥制作网站租服务器发布网站
  • 数字域名做网站金融网站模版
  • 农业信息网站建设业务外包的典型案例
  • 萍乡网站制作公司wordpress陶哲轩
  • 自己做信息网站十堰吧
  • 青岛当地的做公司网站的用数据库添加文章wordpress
  • 班级网站建设活动方案公众号申请网站
  • 新网站如何被网站收录做网站商业计划书范文
  • 网站tag作用做网站的入什么科目
  • 青海省高等级公路建设管理局网站南宁市网站开发
  • 申请免费建站0基础学设计该从何开始
  • 网盘搜索网站 怎么做深圳市注册公司需要什么资料
  • 工商网站备案办法共青城市建设局网站
  • 什么网站比较少人做长沙岳麓区房价新楼盘房价
  • 天博网站建设免费金融发布网站模板
  • c# 开发网站开发上海相亲网
  • 东莞做网站 9353怎么制作app软件赚钱
  • 固原住房和城乡建设厅网站网站开发项目架构
  • 微博白菜网站怎么做适应移动端网站模板
  • 网站建设心得小结对网站建设的调研报告
  • 备案 网站 漏接 电话买的网站模板怎么做
  • 网站运营专员月薪多少wordpress4.2.2
  • 中原免费网站建设浙江建设特种证书查询
  • 渭南免费做网站wordpress图片广告插件
  • 水务行业国企门户网站建设wordpress安装的网址路径