}
关于堆栈和指针(指针例子解释很好)
关于堆栈和指针 堆栈是一种执行“后进先出”算法的数据结构。 设想有一个直径不大、一端开口一端封闭的竹筒。有若干个写有编号的小球,小球的直径比竹筒的直径略小。现在把不同编号的小球放到竹筒里面,可以发现一种规律:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的特点。 堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减1。这个过程叫做“弹出pop”。如此就实现了后进先出的原则。 堆栈是计算机中最常用的一种数据结构,比如函数的调用在计算机中是用堆栈实现的。 堆栈可以用数组存储,也可以用以后会介绍的链表存储。 下面是一个堆栈的结构体定义,包括一个栈顶指针,一个数据项数组。栈顶指针最开始指向-1,然后存入数据时,栈顶指针加1,取出数据后,栈顶指针减1。 #define MAX_SIZE 100 typedef int DATA_TYPE; struct stack { DATA_TYPE data[MAX_SIZE]; int top; }; 堆栈是系统使用是临时存储区域。它是后进先出的数据结构。 C++主要将堆栈用于函数调用。当函数调用时,各种数据被推入堆栈顶部;函数终止后的返回地址、传递给函数的参数、函数返回的结果以及函数中声明的局部变量等等。因此当函数A调用函数B调用函数C,堆栈是增长了,但调用完成后,堆栈又缩小了。 堆是一种长期的存储区域。程序用C++的new操作符分配堆。对new的调用分配所需的内存并返回指向内存的指针。与堆栈不同,你必须通过调用new明确的分配堆内存。你也必须通过调用C++的delete 操作符明确的释放内存,堆不会自动释放内存。 如果C++中的一个类是定义在堆栈上的,就使用"."开访问它的成员。如果是定义在堆上的,就使用"->"指针来开访问。但在,"->"操作符也可以用在堆栈上的类。 什么是指针? 和其它变量一样,指针是基本的变量,所不同的是指针包含一个实际的数据,该数据代表一个可以找到实
巡检机器人中的指针式仪表读数识别系统
巡检机器人中的指针式仪表读数识别系统 发表时间:2019-07-16T14:11:31.203Z 来源:《电力设备》2019年第6期作者:彭鹤 [导读] 摘要:巡检机器人能自动识别仪表设备的状态,先准确定位图像中的仪表设备,在此基础上,实现了仪表读数的自动识别。 (大唐河北发电有限公司马头热电分公司河北省邯郸市 056044) 摘要:巡检机器人能自动识别仪表设备的状态,先准确定位图像中的仪表设备,在此基础上,实现了仪表读数的自动识别。 关键词:巡检机器人;仪表读数识别;指针提取 巡检机器人主要在户外工作,仪器识别算法需适用于各种不同的光照和天气情况,基于此,本文提出了一种迭代最大类间方法,解决了由光照或镜面反射引起的仪器图像过亮或过暗时指针提取问题;提出基于Hough变换的指针角度计算方法,推导了指针角度与仪表读数间的函数关系,实现了指针仪表读数的自动识别。 一、仪表识别算法概述 变电站的仪表多数安置在室外,巡检机器人采集的仪表图像通常受到环境的影响。现有的识别算法为,利用仪表表盘的形状特征,通过模板匹配或椭圆拟合确定仪表表盘在图像中的基本位置及区域范围。其算法虽具备一定实时性和鲁棒性,但并不适用于巡检机器人采集到的变电站仪表图像。这是因变电站设备结构复杂,在机器人采集到的图像中,背景紊乱,并不仅包含仪表区域,还同时囊括了其它设备。在指针识别方面,通常在获取仪表表盘的子图像后,再使用多种的图像处理方法提取仪表指针的位置及指向方向。另外,智能机器人能自动实现对仪表设备的状态识别,必须进行仪表设备在图像中的准确定位,在这基础上,实现仪表读数的自动识别。 二、指针式仪表读数识别 1、指针区域提取。在仪器图像采集过程中,由于受仪器玻璃的光照条件或镜面反射的影响,很难提取仪器指针等特征信息,从而影响仪器的读数识别。因此,在提取指针区域前,需要去除噪声,增强高通图像。为后续指针中心线的精确提取提供清晰的图像,从而提高仪器识别的精度。 1)表盘图像去噪。由于仪器图像在采集过程中会受到噪声的干扰,可采用图像平滑的方法来降低噪声对仪器图像质量的影响。如果平滑窗口太大或太小,仪器图像的细节将变得模糊或边界轮廓将被破坏。本文采用5*5方形窗口的中值滤波去除图像噪声,不仅达到了去噪的目的,而且保持了图像的细节信息。 2)高通增强。为了提高背景与目标区域的灰度差,准确提取指针区域,采用Butterworth高通滤波器对仪器图像进行增强,抑制低频信息。 3)目标分割。最大类间方差是一种常用的自适应目标阈值分割算法,对背景清晰的普通图像具有良好的分割效果,但在对前后景灰度变化不大的情况下,很难实现目标提取。 在实际变电所采集的指针式仪表灰度图像二值化阈值分割过程中发现,当仪表图像在过亮或过暗的光照条件下采集时,目标区域和背景区域的灰度变化很小。采用传统的最大类间方差法进行二值阈值分割后,二值图像中存在较大的黑白区域,无法从仪表表盘区域正确分割,严重影响了后续的指针提取。 鉴于这种现象,在指针区域无法分割的过亮或过暗仪器图像中,背景和目标间的最大类间方差值较小。当最大类间方差在区间范围内时,可正确地实现分割,否则分割失败。最大类间方差可作为衡量指针目标提取是否准确的标准。基于此准则,本文提出了一种迭代的最大类方差方法。采用最大类间方差法对仪器灰度图像进行第一阈值分割时,最大类间方差在其范围内,相应的阈值为最优阈值,否则将第一阈值分割中划分的目标类作为第二最大类间方差阈值分割的对象,判断最大类间方差是否在其范围内。以此类推直到最大类间方差在其范围内,相应的阈值是最佳分割阈值。 2、指针定位。如图1所示,仪表图像中指针具有顶端细,底端粗,灰度关于中心线对称的特性,指针的中心线必须穿过旋转轴。因此,可通过过表盘转动轴心提取指针的中心线来实现指针的定位,并使用直线提取方法来提取指针的中心线。 图1 仪表图像中指针特征 Hough变换是一种检测特定边界形状的方法,常用于直线和圆的检测。它将图像坐标空间转换为参数空间,得到一些峰值,然后通过检测参数空间的峰值给出图像中几何曲线的数学方程。Hough变换能有效地避免图像中某些特征点的干扰,具有良好的容错性和鲁棒性。本文提出了一种基于Hough变换的指针定位算法,用于检测过表盘转动轴心的指针位置。此外,指针的旋转角度限制在仪器量程范围内,在搜索图像的Hough变换值时,可搜索特定角度范围内的直线,从而减少搜索量,提高搜索效率。 三、系统评价与验证 智能巡检机器人系统用于电力系统大型室外变电所仪表的自动识别。而仪器读取识别系统读取采集到的图像,识别结果存储在数据库中,用于后台数据库和专家系统的监控和数据分析。 仪器识别系统以MATLAB R2014A为软件开发环境进行仿真实验,以实际测试现场采集的指针式仪表为测试对象。仪表自动识别系统的指针仪表自动识别模块包括读人图像、指针仪表区域定位和仪表识别。本文提出的指针识别算法主要解决两个关键问题:1)适应各种光照条件下的指针区域自适应提取;2)基于Hough变换的指针定位和读数识别。 1、自适应指针区域提取算法的验证与分析。实验分析表明,采用传统的最大类间方差法对仪器图像进行二值化处理,可在正常光照条件下实现对仪器图像的精确分割,而对光线暗淡或摄像机过度曝光时太暗或太亮的仪器图像,由于仪器图像中背景区域和指针表盘区域的灰度差小,传统的最大类间方差法无法提取表盘区域,从而导致后续仪表读数无法识别。基于此,本文提出的迭代最大类间方差法实现了
C语言中指针、数组和引用例子实例
一、指针:内容是指示一个内存地址的变量;类型是指示编译器怎么解释指针内容指向地址中的内容,以及该内存区域有多大; 例子: [cpp] int i = 0; int * pi = &i; printf(“pi = %x \n”, pi); // 打印pi的内容: 0x2000 printf(“*pi= %d \n” , *pi); // 打印pi指向地址中的值: 5 printf(“&pi= %x \n”, &pi); // 打印pi的地址: 0x100 从汇编的角度来看,指针是这样的: int i = 0; 010E139E mov dword ptr [i],0 int * pi = &i; 010E13A5 lea eax,[i] 010E13A8 mov dword ptr [pi],eax 二、数组:是一个单一数据类型对象的集合。其中单个对象没有被命名,通过索引访问。 数组名和指针的区别:数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组。数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量。指向数组的指针则是另外一种变量类型,仅仅意味着数组的存放地址 注意:虽然数组名可以转换为指向其指代实体的指针,但是它只能被看作一个指针常量,不能被修改,如下:天骄无双:https://www.360docs.net/doc/1817291623.html, [cpp] int intArray[10]; intArray++; // 错误 “指针和数组等价”说的是什么?索引操作相同,例如:p[2]; a[2]; 三、引用(reference)是一个对象的别名。用对象初始化引用后,对象的名字和引用都指向该对象; 引用是如何实现的?从汇编语言的角度来看,指针和引用是一样的: [cpp] int i = 0; 00E9139E mov dword ptr [i],0 int & ref = i; 00E913A5 lea eax,[i] 00E913A8 mov dword ptr [ref],eax int * pi = &i; 00E913AB lea eax,[i] 00E913AE mov dword ptr [pi],eax 指针和引用的区别(从C++使用角度来看): 不存在空引用 引用要初始化 引用初始化后,不能指向另一个对象 这是由编译阶段保证的。 备注:一个指向非常量的引用不能用字面值或者临时值初始化;但是一个指向常量的引用可以。天骄无双:https://www.360docs.net/doc/1817291623.html,
指针式仪表自动读数识别系统设计
指针式仪表自动读数系统设计 摘要 随着模式识别技术、计算机技术等多种技术的不断完善和发展,机器视觉获得了巨大的进步与发展。目前在许多企业中,存在着大量的仪表,仪表的读数都要靠人来完成,工作量很大而且误差率相对来说比较高,基于这个原因,设计了一个工业生产线在线检测数据数字化处理系统。首先通过摄像头采集仪表图像,通过传输装置以无线的方式把图像传输到电脑上,然后在电脑上通过matlab程序设计,处理图像,读取仪表的数据,然后用labview调用matlab程序,并设计一个显示界面,通过界面可以看到实时的数据与仪表图像以及在一段时间内数据的变化情况。最后通过labview访问access数据库,将读取的数据传入数据库中,便于被调用,最终实现检测数据的数字化处理。 关键词:机器视觉图像处理 Matlab Labview
Online testing data of industrial production line digital processing system design Abstract With the development of computer technology and pattern recognition technology,machine vision technology makes a great progress and develop- ment.At present,there are a lot of instrument in many enterprises.in- strument reading work need people to complete.So there are a lot of work to do and efficiency is very low,as the same time,error rate is quite high.For this reason,there design a online testing data of industrial production line digital processing system.First of all,there need to take Picture by camera.next,t hrough transmission device in wireless way to transmit the image to a computer.Then by matlab programming on the compu- ter,d ata processing images, read the meter.And then call matlab by labview and design a display interface.Through the interface can see the real-time data.At last,through labview access access database,and take the data into database.Finally,realize the testing data of the digital processing. Keywords:Machine vision image processing Matlab Labview
C语言数组指针的小例子
1、功能:输入6个学生的5门课程成绩,计算出每个学生的平均分和每门课程的平均分。 2、C语言实现代码:(其实就是用二维数组来实现的,二维数组的引用传递使用数组指针来完成) 复制代码代码如下: #include <stdio.h> #define STUDENT 5 #define SCORE 6 void input_array(float (*score)[STUDENT]); void avg_score(float (*score)[STUDENT]); void avg_course(float (*score)[STUDENT]); /** * calculate student average score and course average socore. */ int main(){ float a[SCORE][STUDENT]; input_array(a); avg_course(a); avg_score(a); } void input_array(float (*score)[STUDENT]){ int i, j; for(i=0; i<SCORE; i++){ printf("input the %d student score:", i+1); for(j=0; j<STUDENT; j++){ scanf("%f", score[i] + j); } } } void avg_course(float (*score)[STUDENT]){ int i,j; float s; for(j=0; j<STUDENT; j++){ printf("course%d ", j); } printf("n"); for(i=0; i<SCORE; i++){ s=0; for(j=0; j<STUDENT; j++){ printf("%f ", *(score[i] + j)); s += *(score[i] + j); }
c语言指针GetMemory经典例子
GetMemory的典型例子 2010-01-13 18:24 520人阅读评论(2) 收藏举报//NO.1:程序首先申请一个char类型的指针str,并把str指向NULL(即str里存的是NULL的地址,*str为NULL中的值为0),调用函数的过程中做了如下动作:1申请一个char 类型的指针p,2把str的内容copy到了p里(这是参数传递过程中系统所做的),3为p指针申请了100个空间,4返回Test函数.最后程序把字符串hello world拷贝到str 指向的内存空间里.到这里错误出现了!str的空间始终为NULL而并没有实际的空间.深刻理解函数调用的第2步,将不难发现问题所在! void GetMemory(char *p) { p = (char*)malloc(100); } void Test(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); } //请问运行Test函数后会是什么样的结果? //NO.2:程序首先申请一个char类型的指针str,并把str指向NULL.调用函数的过程中做了如下动作:1申请一数组p[]并将其赋值为hello world(数组的空间大小为12),2返回数组名p付给str指针(即返回了数组的首地址).那么这样就可以打印出字符串"hello world"了么?当然是不能的!因为在函数调用的时候漏掉了最后一步.也就是在第2步return数组名后,函数调用还要进行一步操作,也就是释放内存空间.当一个函数被调用结束后它会释放掉它里面所有的变量所占用的空间.所以数组空间被释放掉了,也就是说str所指向的内容将不确定是什么东西. char *GetMemory(void) { char p[] = "hello world"; return p;
c语言指针例子
深入理解c语言指针的奥秘 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。 先声明几个指针放着做例子: 例一: (1)int*ptr; (2)char*ptr; (3)int**ptr; (4)int(*ptr)[3]; (5)int*(*ptr)[4]; 如果看不懂后几个例子的话,请参阅我前段时间贴出的文章<<如何理解c和c ++的复杂类型声明>>。 指针的类型 从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型: (1)int*ptr;//指针的类型是int* (2)char*ptr;//指针的类型是char* (3)int**ptr;//指针的类型是int** (4)int(*ptr)[3];//指针的类型是int(*)[3] (5)int*(*ptr)[4];//指针的类型是int*(*)[4] 怎么样?找出指针的类型的方法是不是很简单? 指针所指向的类型
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。 从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如: (1)int*ptr;//指针所指向的类型是int (2)char*ptr;//指针所指向的的类型是char (3)int**ptr;//指针所指向的的类型是int* (4)int(*ptr)[3];//指针所指向的的类型是int()[3] (5)int*(*ptr)[4];//指针所指向的的类型是int*()[4] 在指针的算术运算中,指针所指向的类型有很大的作用。 指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一。我看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,越看越糊涂。 指针的值,或者叫指针所指向的内存区或地址 指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。 指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。 以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里? 指针本身所占据的内存区 指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。 指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。
指针仪表和数显仪表的差别
指针仪表和数显仪表的差别: 指针仪表: 1、只能测量某一相电参量,仪表本身体积和重量也比较大。 2、仪表结构复杂,如果需要高精度的仪表,采用的张丝结构采用的材质基本上用铍铜合金,成本造价比较高。 3、仪表只是单相仪表之外,同时一块仪表也只能测量一种电参量(所谓的单功能表) 4、仪表属于金属制品,仪表的测量精度受时间和严重老化环境(电气室)影响,慢慢要求达不到 5、仪表不具备工业自动化和无人值守综合自动化的功能,不具备通讯和工业自动化的发展方向 6、随着科技的发展,智能化、网络化,高精度,多功能,方便简捷的电子化 产品更加快速的运用到工作和生活中。 数显仪表: 1、具有单相表和三相表,三相电参量测量过程同步,显示同步,更方便用户对现场的系统的安全和指导。 2、电度计量不需要人为去计算和核准,所有测量的电参量数值全部属于一次数值,和现场的实际比较很直观。 3、仪表精度高,重量轻巧,安装简便,售后服务方便。仪表的采样和显示反应速率快,测量数据不断更新(300mS数据更新一次) 4、仪表具有通讯接口(与电脑通讯、以太网通讯)实现遥信、遥控、遥测、遥脉、遥调等通讯功能,实现智能化、自动化、简捷等有效的作用。 5、仪表具有电能脉冲、开关量输入和输出(实现报警、遥控、遥信、控制)等功能、具有电参量的模拟变送功能,实现电参量信号的线性转化和数据远传等功能 6、具有多功能仪表,仪表不仅仅是三相,而且是多功能,同时可以测量多种电参量。一块仪表实现全部电参量的显示测量。大大减少用户维护和电气设备运行的安全指引,确保安全生产的实施。 7、仪表属于低功耗电子产品,产品的设计寿命为10年,产品出厂设置完善,仪表具有可编程性,在现场用户可以结合现场参数自行修改,仪表方便技术改造移动使用。
指针 教案
《指针》教学设计 课题指针学科C语言奥赛授课人 课时两课时年级高一 学情分析 上节课已经学习了函数,函数中有以数组作为形参传递,在此部分中,已经初步认识了地址的概念。学生来自不同的班级,接受能力有所区别;编程能力与水平也有差异。 教学目标1.学生深刻理解地址的概念; 2.学生知道变量地址的概念,能说出不同变量的地址; 3.学生理解变量内容的概念; 4.学生知道如何去引用一个变量的地址; 5.学生能说出指针变量的概念,并比较出指针与指针变量两个概念的区别与联系; 6.学生能较为熟练的使用指针,包括指针变量的定义与操作; 7.学生能说出*与&运算符的关系; 8.学生能理解数组的定义后在内存中的空间分配与赋值操作; 9.学生能够理解指针变量的操作,对其它变量的影响; 10.学生能编写出指针作为形参的函数; 11.学生了解当指针被赋值数组的地址时的操作; 教学内容分析指针作为C语言的一大特色,与其他语言区别开来,第一是必学内容,而也是每年信息奥赛初赛的必考题目内容;指针同时还是C语言实现函数返回多个值与改变实参的唯一方式;指针且是后面学习内容:文件操作、结构体的基础,而结构体又是之后数据结构的基础,因此指针的基础性作用不言而喻。 教学重点1、学生能较为熟练的使用指针,包括指针的定义与操作; 2、学生能说出*与&运算符的关系; 3、学生了解当指针被赋值数组的地址时的操作; 4、学生能够理解指针变量的操作,对其它变量的影响; 5、学生能编写出指针作为形参的函数;
教学难点1、地址的理解; 2、&与*运算符的关系; 3、学生了解当指针被赋值数组的地址时的操作; 4、学生能够理解指针变量的操作,对其它变量的影响; 5、学生能编写出指针作为形参的函数; 教学 方法 问题教学法、讲授教学法、演示教学法、比较教学法、任务驱动 教学 环境 多媒体教室(一人一机)、投影仪、计算机广播控制系统、Dev c++ 4.9、课件等 教学过程教师活动学生活动设计意图 提出现实概念,类比讲解1、提出现实生活中的街道; 2、提出程序中的内存; 3、内存与街道的对比: 内存?街道储存单元?房子地址?门牌号 4、具体讲解地址概念; 积极思考, 一起类比学习 使用现实生活 中概念,类比讲 解抽象概念,突 破难点! 讲解变量地址概念1、模拟当一个变量定义后,为其分配储存单元; 2、强调不同类型变量,地址的不同; 3、提问:已定义的int i与double f它们的地址是多少? 4、提出变量地址概念:系统分配给变量的内存单元的起始地 址 学生与老师一 起观察计算机 为变量分配空 间规律,并回答 具体变量地址, 最终总结出变 量地址概念。 以问题引导方 式,集中学生注 意力,提升学生 总结能力,并加 深学生对变量 地址的概念的 印象。 讲解变量 内容1、模拟为变量赋值后的内存行为; 2、形成变量的第二属性:变量内容; 与老师一起将 熟悉的内容进 行一个更准确 的定义 演示学生熟悉 的操作,但揭示 熟悉的操作背 后的深层次内 容:变量内容的 赋值;
VB调用指针教程与实例
VarPtr 得到的内存地址 ObjPtr 是得到对象入口地址 StrPtr 字符串地址 呵呵有什么用呢?看到下面的文章相信你会有很大的收获的:) 题目:真没想到VB也可以这样用之指针技术 作者:不详,向作者致敬 来源:网络 想当年东方不败,黑木崖密室一战,仅凭一根绣花针独战四大高手,神出鬼没,堪称天下武林第一高手。若想成 为VB里的东方不败,熟习VB《葵花宝典》,掌握VB指针技术,乃是不二的法门。 欲练神功,引刀……,其实掌握VB指针技术,并不需要那么痛苦。因为说穿了,也就那么几招,再勤加练习,终可 至神出鬼没之境。废话少说,让我们先从指针的定义说起。 一、指针是什么?
不需要去找什么标准的定义,它就是一个32位整数,在C语言和在VB里都可以用Long类型来表示。在32位Windows 平台下它和普通的32位长整型数没有什么不同,只不过它的值是一个内存地址,正是因为这个整数象针一样指向一个 内存地址,所以就有了指针的概念。 有统计表明,很大一部分程序缺陷和内存的错误访问有关。正是因为指针直接和内存打交道,所以指针一直以来 被看成一个危险的东西。以至于不少语言,如著名的JAVA,都不提供对指针操作的支持,所有的内存访问方面的处理 都由编译器来完成。而象C和C++,指针的使用则是基本功,指针给了程序员极大的自由去随心所欲地处理内存访问, 很多非常巧妙的东西都要依靠指针技术来完成。 关于一门高级的程序设计语言是不是应该取消指针操作,关于没有指针操作算不算一门语言的优点,我在这里不
讨论,因为互联网上关于这方面的没有结果的讨论,已经造成了占用几个GB的资源。无论最终你是不是要下定决心修 习指针技术《葵花宝典》,了解这门功夫总是有益处的。 注意:在VB里,官方是不鼓励使用什么指针的,本文所讲的任何东西你都别指望取得官方的技术支持,一切都要 靠我们自己的努力,一切都更刺激! 让我们开始神奇的VB指针探险吧! 二、来看看指针能做什么?有什么用? 先来看两个程序,程序的功能都是交换两个字串: 【程序一】: '标准的做法SwapStr Sub SwapStr(sA As String, sB As String) Dim sTmp As String sTmp = sA: sA = sB: sB = sTmp End Sub
解析实用C语言编程中指针赋值的实例
解析C语言编程中指针赋值的实例 从const int i 说起 你知道我们声明一个变量时象这样int i ;这个i是可能在它处重新变赋值的。如下: int i = 0;/* . . . */i = 20; /*这里重新赋值了*/ 不过有一天我的程序可能需要这样一个变量(暂且称它变量),在声明时就赋一个初始值。之后我的程序在其它任何处都不会再去重新对它赋值。那我又应该怎么办呢?用const 。 /* . . . */const int ic =20;/* . . . */ic = 40; /*这样是不可以的,编译时是无法通过,因为我们不能对const 修饰的ic重新赋值的。*//*这样我们的程序就会更早更容易发现问题了。*//* . . . */ 有了const修饰的ic 我们不称它为变量,而称符号常量,代表着20这个数。这就是const 的作用。ic是不能在它处重新赋新值了。 认识了const 作用之后,另外,我们还要知道格式的写法。有两种: const int ic = 20; 与 int const ic = 20; 它们是完全相同的。这一点我们是要清楚。总之,务必要记住const 与int哪个写前都不影响语义。有了这个概念后,我们来看这两个家伙:
const int *pi 与 int const *pi 按普通的逻辑看,它们的语义有不同吗?呵呵,只要记住一点:int 与const 哪个放前哪个放后都是一样的,就好比const int ic;与int const ic;一样。也就是说,它们是相同的。 好了,我们现在已经搞定一个“双包胎”的问题。那么 int *const pi; 与前两个语句又有什么不同呢?下面就来具体分析它们的格式与语义吧。 先来说说const int *pi是什么作用(当然int const *pi也是一样的,前面我们说过,它们实际是一样的)。看下面的例子:#include stdio.hmain(){ /* 代码开始*/ int i1 = 30; int i2 = 40; /* 现在pi 变量的内容为i1 的内存地址*/ const int *pi = i1; /* 注意这里,pi可以在任意时候重新赋值一个新内存地址*/ /* pi 变量的内容为i2 的内存地址*/ pi = i2; /* 想想看:这里能用*pi = 80来代替吗?当然不能!*/ i2 = 80; printf(%dn, *pi); /* 输出是80 */ /* 代码结束*/} 语义分析: 看出来了没有,pi的值是可以被修改的。即它可以重新指向另一个地址的,但是,不能通过*pi来修改i2的值。这个规则符合我们前面所讲的逻辑吗?当然符合了。
《C++程序设计案例教程》C++指针练习题
指针练习题 一、选择题 1. 阅读下面程序,执行后的结果为() # include “stdio.h” void fun ( int *a , int *b ) { int k=5; *a = k ; *b = *a + k ; } main( ) { int *a , *b, x = 10 , y = 15 ; a= &x ; b = &y ; fun ( a , b ); printf ( “%d,%d\n”, *a , *b ) ; } A) 10,15 B) 5,15 C) 5,10 D) 15,10 2.以下选项中,不能正确赋值的是() A) char s[ ] = “china” ; B) char s[10 ] ; s1[ ]= “china” ; C) char *s = “china” ; D) char *s[4] = “china\n” ; 3. 设有以下定义: int a[4][3]= {1,2,3,4,5,6,7,8,9,10,11,12}; int(*prt) [3] = a ,*p=a[0]; 则下列能够正确表示数组元素a[1][2]的表达式是() A) * ( (*prt+1) [2] ) B) *(*(p+5))C) (*prt+1) +2 D) *(p+5) 4.已知: int a[6], *p = a ; 则下列不能表示a[1]地址的表达式是( ) A) p+1 B) ++p C) a+1 D) a++ 5. 以下程序的运行结果是( ) # include “stdio.h” main( ) { int a[ ]={1,2,3, 4,5,6,7,8,9,10,11,12}; int *p=a+5; *q=NULL; *q=*(p+5); printf(“%d %d\n”,*p,*q ); }
C语言程设计实验与案例周信东主编实验八 指针
实验6 指针 学号:1700200224姓名:莫新锋实验日期: 一、实验目的和要求 (1)掌握指针的概念、指针变量定义和引用。 (2)掌握指针的运用方法。 (3)掌握数组的指针和指向数组的指针变量。 (4)掌握指针与函数的关系。 (5)能正确使用字符串的指针和指向字符串的指针变量。 (6)了解指向函数的指针。 (7)了解指向指针变量的指针的概念及其使用方法。 二、实验内容 完成实验指导书中的实验八“基础部分”和“增强部分”的题目。 实验九的内容由同学自行选作。 三、实验步骤及结果 【基础题】:Ex8-1请在下面分别插入改正错误后的源程序代码及运行成功时的画面源程序代码: 请在此粘贴修改后正确的程序代码。、 #include //#define N 12 void main() { int j, a[12],*p=a; //p=&a[N]; for(j=1;j<=12;j++) scanf("%d",p); for(j=1;j<=12;j++) { printf("%d",p++); if(j%4==0) printf("\n"); }
} 运行结果: 请在此粘贴本程序运行结果的截图 Ex8-2请在下面插入该程序的运行结果的画面:运行结果: #include swap(int *pl,int *p2) { int p; p=*pl; *pl=*p2; *p2=p; } void main() { int n1,n2,n3; int *p1,*p2,*p3; printf("Input n1,n2,n3: ");
scanf("%d,%d,%d",&n1 ,&n2,&n3); p1=&n1; p2=&n2; p3=&n3; if (n1>n2) swap(p1,p2); if (n1>n3) swap(p1,p3); if(n2>n3) swap(p2,p3); printf("The result is:%d %d %dn",n1,n2,n3); } 请在此粘贴本程序运行结果的截图 试用解释本程序是如何通过指针参数p1、p2改变主函数main中的变量n1、n2、n3的值的? 请回答问题 将n1,n2,n3的地址分别给p1,p2,p3,通过对n1,n2,n3两两的比较,调用函数swap进行排序,进而得到新的地址排序后输出 【增强题】:Eh8-1请在下面分别完成本题的源程序代码及运行结果的画面:源程序代码: 请在此粘贴完成本题的程序源代码。 #include void main()
指向指针的指针实例.
指向指针的指针实例 关键字:指针 我们想在函数pro()中改变指针p的值(记住:是指针p的值,而不是p所指向的地址的值)。能实现吗?结果是不能,为什么?我们来分析一下 先看一个例子: #include char buf[10] = "hello"; void pro(char *out) { out = buf; } main() { char *p = NULL; pro(p); printf("%s\n", p); } 我们想在函数pro()中改变指针p的值(记住:是指针p的值,而不是p所指向的地址的值)。能实现吗? 结果是不能,为什么?我们来分析一下。 如果不用函数pro(),我们可以直接在主函数中用 p = buf 来实现。如果使用函数pro(),就变得稍微复杂了。 因为我们要在函数pro()中改变指针p的值,而函数pro()又没有返回值,如何记住这个改变呢? 我们可以先用简单的例子说明: #include void pro(char *out) { out[1] = 'o'; } main() {
char *p = "hello"; pro(p); printf("%s\n", p); } 这个例子是改变了字符串指针p所指向的字符串的指,它能记住这个改变是因为在函数中是对指针所指向的地址 空间进行操作。你明白了吗?也就是说,函数的参数是char *out,我们可以改变 *out,但改变不了out本身。 所以针对第一个例子,我们要想改变p,必须把&p当作参数传给函数pro()。修改后的例子如下: #include char buf[10] = "hello"; void pro(char **out) { *out = buf; } main() { char *p = NULL; pro(&p); printf("%s\n", p); }
实验8 指针的应用
实验八指针的应用(2学时) 实验前必须做的操作 ...... .........—— ..新建文件夹: 首先在各自对应的计算机ncre(k:)盘上对应座位号文件夹内新建一个文件夹,文件夹的名字为“班级+学号的后两位+姓名”,如座位号为K02,航海1111班、学号后两位是02的、姓名为“张强”的同学,则其对应的文件夹名字是:航海111102张强。然后在刚才建好的文件夹里面再建立一个文件夹,文件夹为“实验8”。 【实验目的】 1、掌握指针的概念、指针变量定义格式; 2、掌握指针的运算; 3、学会用指针对变量进行操作; 4、掌握指针与数组的关系; 5、了解通过指针操作字符串的方法; 6、了解指针与函数的关系; 7、了解指向指针变量的指针。 【实验内容】 [实验任务一]:补充完整程序,掌握C语言中与指针有关的算法。 程序填空实例8-1:使用指针把从键盘输入的2个数按从大到小的顺序输出(不改变变量的值),请补充完整并上机调试。将填空后完整的程序以文件名为blank8_1.c保存在实验8文件夹里。(需要存盘) 第 1 页共10 页
第 2 页 共 10 页 程序填空实例8-2:输入10个整数存入一维数组,再按逆序重新调整该数组中元素的顺序然后再输出。下面给出部分程序的内容,请将程序补充完整,然后上机调试。 将填空后完整的程序以文件名为nixu_1.c 保存在实验8文件夹里。 (需要存盘) 将填空后完整的程序以文件名为nixu_1.c 保存在实验8文件夹里。 (需要存盘 )
程序填空实例8-3:用指针访问简单变量。从键盘输入三个整数,要求设三个指针变量p1,p2,p3,使p1指向三个数的最大者,p2指向次大者,p3指向最小者,然后按由小到大的顺序输出这三个数。将填空后完整的程序以文件名为blank8_3.c保存在实验8文件夹里。(需要存盘) 程序填空实例8-4:用指针来处理一维数组元素。从键盘上输入若干个字符,以符号“@”结束。编一个C程序,统计这些符号的个数(不包括@)存入数组元素a[0],将这些符号依次存入a[1]、a[2]、a[3]、…中。接着利用a[0]中存放的字符个数,输出这些字符。将填空后完整的程序以文件名为blank8_4.c保存在实验8文件夹里。(需要存盘) 【待填充的源程序参考清单】 #include void main( ) { char a[100]={0}, =a, c; scanf ("%c", &c); while( ) { ; ; *pa=c; scanf("%c", &c); } printf("\nnumber of string: %d\nstring:\n", a[0]); for(pa=a+1; pa<= ;pa++) printf("%c",*pa); printf("\n"); } 第 3 页共10 页
C 指针数组的使用例子
C++指针数组的使用例子 在C++语言中,数组元素全为指针的数组称为指针数组 // 0220.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int arr[]={1,2,3,4,54}; //第一种 for(int i=0;i<5;i++) { printf("%d\t",arr[i]); } printf("\n"); //第二种 for(int i=0;i<5;i++) { printf("%d\t",*(arr+i));//不可用i++ }
printf("\n"); //第三种 int *p1=&arr[0]; for(int i=0;i<5;i++) { printf("%d\t",*p1); p1++; } printf("\n"); //第四种 int *p2=&arr[0]; for(int i=0;i<5;i++) { printf("%d\t",*(p2+i)); } printf("\n"); //第五种 int *p22=arr; for(int i=0;i<5;i++) { printf("%d\t",p22[i]); //指针可以当作数组来操作
//第六种;通过指针复制不同类型的数组 printf("\n"); char arr1[]={255,255,255,254, 255,255,255,255}; int arr2[]={1,1}; int *p3=(int*)arr1;//把arr1强制转换成int型使arr1指针偏移与arr2一致以便通过指针复制数值 int *p4=arr2; //这个强制类型转换实质就是为了同步两个数组的偏移量!!!! for(int i=0;i<2;i++) { *(p4+i)=*(p3+i); } for(int i=0;i<2;i++) { printf("%x",*(p4+i)); } printf("\n"); return 0;