当前位置:文档之家› c++指针函数和变量地址做形参的用法

c++指针函数和变量地址做形参的用法

c++指针函数和变量地址做形参的用法
c++指针函数和变量地址做形参的用法

指针函数的用法

1、例:char *getnum(int num,int addr)

字符型指针函数返回值为字符地址。即:return返回指针地址。

例:声明字符型指针char *a。返回值只能写return a;不能写return *a;

也不能写:char a; return a; 会报“cannot convert from 'char' to 'char *'”错误

2、cout<<*getnum(12,addr)<

函数返回以后*getnum(12,addr)的结果为*a指向的内容。

程序如下:

#include //引用库函数

using namespace std; //使用命名空间

int main() //主函数,程序执行的入口

{

cout<<"*********************"<

char *getnum(int num,int addr);

char * q;

char a='s';

q=&a;

cout<<*q<

//a=10;

cout<<"****************"<

char buf[10]={0};

buf[1]=*q;

cout<

int addr=11;

//getnum(12,addr);

cout<<*getnum(12,addr)<

cout<

return 0; //函数返回值

}

char *getnum(int num,int addr)

{

addr=10;

char d[10]={'d','s'};

char *a=d;

cout<<"a="<<&a<

return a;

}

变量地址做形参用法

注:在程序中定义变量short yxval=11; 将yxval的地址作为函数的形参。经过函数运算,改变的始终是变量yxval的值。

#include //引用库函数

using namespace std; //使用命名空间

int main() //主函数,程序执行的入口

{

////////////////////////////////////////////////////////////////////////

cout<<"****************函数传入地址"<

int getyxdata(int a,short & yxval); // 函数声明

short yxval=11; //定义变量yxval

int k=0;

getyxdata(k,yxval); //将变量地址传入函数中。注意:这里只能写getyxdata(k,yxval),

//不能写成getyxdata(k,&yxval) cout<<"yxval="<

return 0; //函数返回值

}

int getyxdata(int k ,short & yxval) //传入参数yxval。注意:这里需要加入&符号

{

//yxval=12;

return 0;

}

C语言指针用法详解

让你不再害怕指针 前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则: 从变量名处起,根据运算符优先级结合,一步一步分析. 下面让我们先从简单的类型开始慢慢分析吧: int p; //这是一个普通的整型变量 int *p; //首先从P处开始,先与*结合,所以说明P是一个指针,然后再与int结合, //说明指针所指向的内容的类型为int型.所以P是一个返回整型数据的指针int p[3]; // 首先从P处开始,先与[]结合,说明P是一个数组,然后与int结合, // 说明数组里的元素是整型的,所以P是一个由整型数据组成的数组int *p[3]; //首先从P处开始,先与[]结合,因为其优先级比*高,所以P是一个数组, //然后再与*结合,说明数组里的元素是指针类型, 然后再与int结合, //说明指针所指向的内容的类型是整型的,所以P是一个由返回整型数据 //的指针所组成的数组 int (*p)[3]; //首先从P处开始,先与*结合,说明P是一个指针,然后再与[]结合 //(与"()"这步可以忽略,只是为了改变优先级), 说明指针所指向的 //内容是一个数组,然后再与int结合, 说明数组里的元素是整型的. //所以P是一个指向由整型数据组成的数组的指针 int **p; //首先从P开始,先与*结合,说是P是一个指针,然后再与*结合, 说明指 //针所指向的元素是指针,然后再与int结合, 说明该指针所指向的元素 //是整型数据.由于二级指针以及更高级的指针极少用在复杂类型中, 所 //以后面更复杂的类型我们就不考虑多级指针了, 最多只考虑一级指针. int p(int); //从P处起,先与()结合,说明P是一个函数,然后进入()里分析,说明该 //函数有一个整型变量的参数,然后再与外面的int结合, 说明函数的 //返回值是一个整型数据 Int (*p)(int); //从P处开始,先与指针结合,说明P是一个指针,然后与()结合,

C语言中数组指针在汇编语言寻址方式中的应用

231 1、引言 《汇编语言程序设计》是高等院校计算机及相近专业学生必修的专业基础课程之一,它不仅是《嵌入式开发》、《操作系统》、《单片机》、《接口技术》等基础课程的先修课程,而且也十分有助于学生系 统掌握计算机基础知识和提高编程能力[1] 。作为一门直接控制计算机硬件和cpu结合最为紧密的一门语言,执行起来时最为有效和速度最快的。但是区别于高级语言他又自身的弱点,比如可读性差,需要更深入地熟悉硬件结构,编程和调试过程繁琐,而且没有便捷的开发调试环境。在讲授《汇编语言程序设计》过程中,如果能够结合或者转化为高级语言如C语言的内容那学生接受和学习起来就能增加不少的兴趣,提高学生的学习效率。 2、C 语言数组和指针的使用 2.1 数组 数组是在程序设计中为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元 素的集合称为数组[2] 。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因在汇编语言中主要把指令系统中的寻址方式转换为一维数组或指针,所以下面就简要介绍一下一维数组和指针的特点 定义一维数组的格式为: 类型说明符 数组名[整型常量表达式],…;例如:int a[10],b[5];说明: (1)它表示定义了两个一维数组,一个数组名为a,另一个数组名为b。数组名是按照“标识符”的规则构成的。(2)a数组含有10个数组元素,即a[0]、a[1]、a[2]、…、a[9];b数组含有5个数组元素,即b[0]、b[1]、b[2]、b[3]和b[4]。注意,不能使用a[10]和b[5],否则即出现数组超界现象,并且需要注意的是数组的小标是从0开始的。(3)类型说明符int 说明a数组和b数组中的每个元素均占2个字节,只能存放整型数据。(4)整型常量表达式可以是整型常量或符号常量。最常见的是整型常量。不允许为变量。(5)C编译程序(如Turbo C)为a数组在内存中分配了10个连续的数组单元(共占20个字节),为b数组在内存中分配了5个连续的数组单元(共占10个字节)。(6)C编译程序还指定数组名a为数组的首地址,即a与&a[0]等价;指定数组名b为b数组的首地址,即b与&b[0]等价。 2.2 指针 指针是一个特殊的变量,它里面存储的数值被解释成为内存里 的一个地址。计算机内存中的每个内存单元,都有相应的内存地址。在程序中对变量进行存取操作有两种方式,一种叫“直接存取”,就是指在程序中对变量进行存取操作时是按变量的地址来存取的方法,另一种叫“间接存取”,就是通过另外定义一个指针变量来保存 需要访问的数据的地址[3] 。 (1)指向简单变量的指针。(2)指向数组的指针。指针所指的数组既可以是一维数组,也可是多维数组。(3)指针数组。数组的元素值为指针,指针数组是一组有序的指针集合。(4)指向指针的指针。如 果一个指针变量存放的是另一个指针变量的地址,则称这个指针变 量为指向指针的指针。(5)指向函数的指针。在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址赋予一个指针变量,通过指针变量就可以找到并调用这个函数。 3、数组和指针在汇编语言指令系统寻址方式中的应用和转换 3.1 汇编语言指令系统的寻址方式[4] (1)立即寻址。(2)寄存器寻址。(3)直接寻址。(4)寄存器间接寻址:指令中指出一个基址寄存器BX、BP或变址寄存器SI、DI,并以其内容做为操作数的有效地址,ADD AX,[BP]物理地址=10H×(SS)+(BP)。(5)寄存器相对寻址:指令中指出一个基址或变址寄存器,同时给出一个位移量, 寄存器内容与位移之和做为操作数的有效地址。MOV AX,[DI+100H],有效地址EA=(DI)+100H,为物理地址=10H×(DS)+(DI)+100H。(6)基址变址寻址:指令同时指出一个基址寄存器和一个变址寄存器,两寄存器内容的和为操作数的有效地址。ADD AX,[BX][SI],有效地址EA=(BX)+(SI)。物理地址=10H×(DS)+(BX)+(SI)。(7)相对基址变址寻址:指令中给出一个基址寄存器一个变址寄存器和一个位移量。两个寄存器的内容及位移量三者之和做为操作数的有效地址。例:MOV DX,100H [BX] [SI,物理地址=10H×(DS)+(BX)+(SI)+100H。 3.2 间接寻址方式转换为数组或指针 3.2.1 寄存器间接寻址转成一维数组来理解 形式:ADD AX,[BP]物理地址=10H×(SS)+(BP)。我们就可以认为,在此定义了一个数组SS,即SS中的值为这个数组的首地址,当然我们知道这个数组的最大元素个数为64K个。刚才谈到偏移量和数组下标都是从0开始的,所以偏移量BP就可以认为是这个数组的一个下标,在这寻址操作数的时候是要把这个下标作为一个内存地址,其所存储的内容就是我们所要找的操作数。 在数组中形如I=A[10]就是把A数组的第10个元素赋值给I,在ADD AX,[BP]语句中BP也有一个中括号,只是在这个地方省略了数组名;并且也是把SS数组的第BP个元素赋值给AX。 所以无论从形式还是从本质上就把寄存器间接寻址转换成了一个一维数组。 3.2.2 寄存器间接寻址转成指针来理解因为指针和数组有时间是可以相互转换的,所以在这也可以转换成指针来理解。 形式:ADD AX,[BP]物理地址=10H×(SS)+(BP)。BP在汇编语言中本身就定义为一个基址“指针”用来和堆栈段配对使用,其中存放的数据是堆栈段的某一个存储单元地址。这就和指针吻合了,前面说到指针变量名与地址间具有一一对应关系,在存取操作时是按变量的地址来进行的一种“间接存取”的方法。那么这个地方我们可以认为BP是一个指向堆栈段中某一个存储单元的C语言意义上的指针。 这样就把寄存器间接寻址方式可以理解成C语言意义上的指针。对于寄存器相对寻址、基址变址寻址、基址变址寻址我们也都 C语言中数组指针在汇编语言寻址方式中的应用 马耀锋 李红丽 (中州大学信息工程学院 河南郑州 450044) 摘要:因高级语言不需要熟悉低层软件和硬件知识,所以学生有很大的学习兴趣,数组指针是C 语言中的重点内容,学生们都能熟练掌握。而汇编语言因与硬件紧密相连,所以学生学习兴趣不大。为了更好的培养学生的学习兴趣,提高教学效率,本文通过分析数组指针与寻址方式的异同,提出了如何把寻址方式转化成数组指针来学习的方法。 关键词:数组 指针 寻址方式中图分类号:TP312.1-4文献标识码:A 文章编号:1007-9416(2012)04-0231-02 ??????下转第232页

C指针函数习题

C++指针函数习题 一、选择题 1.以下程序的运行结果是()。 sub(int x, int y, int *z) { *z=y-x; } void main() { int a,b; sub(10,5,&a); sub(7,a,&b); cout< #include<>

指向指针的指针——彻底搞定C指针

彻底搞定C指针---指向指针的指针 彻底搞定C指针---指向指针的指针一.回顾指针概念: 今天我们又要学习一个叫做指向另一指针地址的指针。让我们先回顾一下指针的概念吧! 当我们程序如下申明变量: short int i; char a; short int * pi; 程序会在内存某地址空间上为各变量开辟空间,如下图所示。 内存地址→6 7 8 9 10 11 12 13 14 15 ------------------------------------------------------------------------------------- … | | | | | | | | | | ------------------------------------------------------------------------------------- |short int i |char a| |short int * pi| 图中所示中可看出: i 变量在内存地址5的位置,占两个字节。 a变量在内存地址7的位置,占一个字节。 pi变量在内存地址9的位置,占两个字节。(注:pi 是指针,我这里指针的宽度只有两个字节,32位系统是四个字节) 接下来如下赋值: i=50; pi=&i; 经过上在两句的赋值,变量的内存映象如下: 内存地址→6 7 8 9 10 11 12 13 14 15 -------------------------------------------------------------------------------------- … | 50 | | | 6 | | | | -------------------------------------------------------------------------------------- |short int i |char a| |short int * pi| 看到没有:短整型指针变量pi的值为6,它就是I变量的内存起始地址。所以,这时当我们对*pi进行读写操作时,其实就是对i变量的读写操作。如:*pi=5; //就是等价于I=5; 你可以回看本系列的第二篇,那里有更加详细的解说。 二.指针的地址与指向另一指针地址的指针 在上一节中,我们看到,指针变量本身与其它变量一样也是在某个内存地址中的,如pi的内存起始地址是10。同样的,我们也可能让某个指针指向这个

函数指针

方法 指针函数和函数指针的区别 关于函数指针数组的定义 为函数指针数组赋值 函数指针的声明方法为: 数据类型标志符 (指针变量名) (形参列表); 注1:“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如: int func(int x); /* 声明一个函数 */ int (*f) (int x); /* 声明一个函数指针 */ f=func; /* 将func函数的首地址赋给指针f */ 赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。 注2:函数括号中的形参可有可无,视情况而定。 下面的程序说明了函数指针调用函数的方法: 例一、 #include int max(int x,int y){ return(x>y?x:y); } void main() { int (*ptr)(int, int); int a,b,c; ptr=max; scanf("%d%d",&a,&b); c=(*ptr)(a,b); printf("a=%d,b=%d,max=%d",a,b,c); } ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr 和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个

指针万用表的使用方法

指针万用表的使用方法 (1)测试前,首先把万用表放置水平状态,并视其表针是否处于零点(指电流、电压刻度的零点),若不在,则应调整表头下方的“机械零位调整”,使指针指向零点。 (2)根据被测项,正确选择万用表上的测量项目及量程开关。 如已知被测量的数量级,则就选择与其相对应的数量级量程。如不知被测量值的数量级,则应从选择最大量程开始测量,当指针偏转角太小而无法精确读数时,再把量程减小。一般以指针偏转角不小于最大刻度的30%为合理量程。 (3)万用表作为电流表使用 ①把万用表串接在被测电路中时,应注意电流的方向。即 把红表笔接电流流入的一端,黑表笔接电流流出的一端。如果不知被测电流的方向,可以在电路的一端先接好一支表笔,另一支表笔在电路的另—端轻轻地碰一下,如果指针向右摆动,说明接线正确;如果指针向左摆动(低于零点),说明接线不正确,应把万用表的两支表笔位置调换。 ②在指针偏转角大于或等于最大刻度30%时,尽量选用大量程档。因为量程愈大,分流电阻愈小,电流表的等效内阻愈小,这时被测电路引入的误差也愈小。 ③在测大电流(如500mA)时,千万不要在测量过程中拨动量程选择开关,以免产生电弧,烧坏转换开关的触点。 (4)万用表作为电压表使用 ①把万用表并接在被测电路上,在测量直流电压时,应注意被测点电压的极性,即把红表笔接电压高的一端,黑表笔接电压低的一端。如果不知被测电压的极性,可按前述测电流时的试探方法试一试,如指针向右偏转,则可以进行测量;如指针向左偏转,则把红、黑表笔调换位置,方可测量。

②与上述电流表一样,为了减小电压表内阻引入的误差,在指针偏转角大于或等于最大刻度的30%时,测量尽量选择大量程档。因为量程愈大,分压电阻愈大,电压表的等效内阻愈大,这对被测电路引入的误差愈小。如果被测电路的内阻很大,就要求电压表的内阻更大,才会使测量精度高。此时需换用电压灵敏度更高(内阻更大)的万用表来进行测量。如MFl0型万用表的最大直流电压灵敏度(100千欧/V)比ME30型万用表的最大直流电压灵敏度(20千欧/V)高。③在测量交流电压时,不必考虑极性问题,只要将万用表并接在被测两端即可。另外,一般也不必选用大量程档或选高电压灵敏度的万用表。因为一般情况下,交流电源的内阻都比胶小。值得注意的是被测交流电压只能是正弦波,其频率应小于或等于万用表的允许工作频率,否则就会产生较大误差。 ④不要在测较高的电压(如220v)时拨动量程选择开关,以免产生电弧,烧坏转换开关关的触点。 ⑤在测量大于或等于100v的高电压时,必须注意安全。最好先把—支表笔固定在被测电路的公共地端,然后用另一支表笔去碰触另——端测试点。 ⑥在电路系统中常用电平来表示该点的电压有效值。故万用表在交流电压档上带有电平刻度,零电平是指600欧阻抗上产生1mW的功率,即对应的电压有效值为0.75V。如果破测电路阻抗不等于600欧,则按下式进行核算:实际电子值=万用表dB读数+101g(600/z)式中,z为被测电路的阻值。值得指出的是:测电平时应放置在10v档上,因为万用表电平刻度是在该档上设计计算的,如果量程不够,需换另外档测量另外万用表只适宜测音量频电平,如电路上有直流电压,还必须串接一只0.1uF/450V电容器将直流隔断后再测量 ⑦在测量有感抗的电路中的电压时,必须在测量后先把万用表断开再关电源。不然会在切断电源时,因为电路中感抗元件的自感现象,会产生高压而可能把

指针变量作为函数参数

用名作为其他变量名地别名. ; 等价于; ()声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名地一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元.故:对引用求地址,就是对目标变量求地址.与相等. ()不能建立数组地引用.因为数组是一个由若干个元素所组成地集合,所以无法建立一个数组地别名. 引用应用 、引用作为参数 引用地一个重要作用就是作为函数地参数.以前地语言中函数参数传递是值传递,如果有大块数据作为参数传递地时候,采用地方案往往是指针,因为这样可以避免将整块数据全部压栈,可以提高程序地效率.但是现在(中)又增加了一种同样有效率地选择(在某些特殊情况下又是必须地选择),就是引用. 【例】: ( , ) 此处函数地形参, 都是引用 { ; ; ; ; } 为在程序中调用该函数,则相应地主调函数地调用点处,直接以变量作为实参进行调用即可,而不需要实参变量有任何地特殊要求.如:对应上面定义地函数,相应地主调函数可写为: ( ) { ; >>>>; 输入两变量地值 (); 直接以变量和作为实参调用函数 <<<< ' ' <<; 输出结果 }

上述程序运行时,如果输入数据并回车后,则输出结果为. 由【例】可看出: ()传递引用给函数与传递指针地效果是一样地.这时,被调函数地形参就成为原来主调函数中地实参变量或对象地一个别名来使用,所以在被调函数中对形参变量地操作就是对其相应地目标对象(在主调函数中)地操作. ()使用引用传递函数地参数,在内存中并没有产生实参地副本,它是直接对实参操作;而使用一般变量传递函数地参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量地副本;如果传递地是对象,还将调用拷贝构造函数.因此,当参数传递地数据较大时,用引用比用一般变量传递参数地效率和所占空间都好. ()使用指针作为函数地参数虽然也能达到与使用引用地效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"地形式进行运算,这很容易产生错误且程序地阅读性较差;另一方面,在主调函数地调用点处,必须用变量地地址作为实参.而引用更容易使用,更清晰. 如果既要利用引用提高程序地效率,又要保护传递给函数地数据不在函数中被改变,就应使用常引用. 、常引用 常引用声明方式:类型标识符引用名目标变量名; 用这种方式声明地引用,不能通过引用对目标变量地值进行修改,从而使引用地目标成为,达到了引用地安全性. 【例】: ; ; ; 错误 ; 正确 这不光是让代码更健壮,也有些其它方面地需要. 【例】:假设有如下函数声明:

指针练习题

. 编程题 1用指向数组的指针变量输出数组的全部元素 2 使用函数调用,形参为指针,实参为数组,把一个数组逆序存放在输出 练习题: 一判断题 1.指针是变量,它具有的值是某个变量或对象的地址值,它还具有一个地址值,这两个地址值是相等的。 2.指针的类型是它所指向的变量或对象的类型。 3.定义指针时不可以赋初值。 4.指针可以赋值,给指针赋值时一定要类型相同,级别一致。5.指针可以加上或减去一个int型数,也可以加上一个指针。6.两个指针在任何情况下相减都是有意义的。 7.数组元素可以用下标表示,也可以用指针表示。 8.指向数组元素的指针只可指向数组的首元素。 9.字符指针是指向字符串的指针,可以用字符串常量给字符指针赋值。 10.引用是一种变量,它也有值和地址值。 11.引用是某个变量的别名,引用是被绑定在被引用的变量上。

12.创建引用时要用一个同类型的变量进行初始化。 13.指针是变量,它可以有引用,而引用不能有引用。 ;. . 二单选题 1.下列关于定义一个指向double型变量的指针,正确的是()。A.int a(5);double *pd=a; B.double d(2.5),*pd=&d;C.double d(2.5),*pd=d; D.double a(2.5),pd=d;。).下列关于创建一个int型变量的引用,正确的是(2A.int a(3),&ra=a; B int . a(3),&ra=&a;ra=a;D.int a(3), C.double d(3.1);int &rd=d;.下列关于指针概念的描述中,错误的是()。3 A.指针中存放的 是某变量或对象的地址值.指针的类型是它所存放的数值的类型 B .指针是变量,它也具有一个内存地址值 C .指针的值是可以改 变的D 。.下列关于引用概念的描述中,错误的是()4 A.引 用是变量,它具有值和地址值 B.引用不可以作数组元素 C.引用是变量的别名 D.创建引用时必须进行初始化。++*p相同的是()*p=a5.已知:int a[5],;则与a[0] . B.*++p A++a[0] .C*p++ D.;. . 6.已知:int a[ ]={1,2,3,4,5},*p=a;在下列数组元素地址的表

引用和指针的区别

在c++函数中,形式参数用引用和用指针都可以起到在被调用函数中改变调用函数的变量的作用。什么时候用引用作参数?什么时候用指针作参数呢void function (int *ptr); void function(int &ref); 没有特定的规定。。学的久了,就会习惯什么时候用指针什么时候用引用了! 引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。 C++中尽量用引用。个人觉得所有的引用都可以用指针,但指针比引用容易出错。 引用当然更直观更直接,做参数时,如果在函数内不刻意要用指针的那些副作用(如越界访问,动态定向什么的),引用可以代替指针。 C++ 中一般都用引用就可以了 ... C 中没有引用,就使用指针 .... 举例如下: 1 使用指针传递参数时: void function (int *ptr) { 函数体;} 调用该函数时 main() { int p; function (&p); } 2 使用引用传递参数时: void function(int &ref) { 函数体;} 调用该函数时 main() { int p; function (p); } 由此可见,使用引用比使用指针传递参数函数调用时更简单,引用和指针功能大体相同,但是有空间分配时建议最好使用指针,因为在释放空间时, 对指针只需要delete就行了,而引用是不能删除空间的,引用必须指向一个存在的对象。 指针和引用的差别 1. 非空的差别任何情况下都不能使用指向空值的引用.一个引用必须总是指向某个对象. 不存在的指向空值的引用这个事实意味着使用引用的代码效率比使用指针要高. 2. 合法性区别在使用引用之前不需要测试他的合法性.指针必须测试. 3. 可修改区别指针可以被重新赋值给另一个不同的对象.但是引用总是指向在初始化的时候被制定的对象,以后不能改变.但是指定的对象其内容可以改变. 应该使用指针的情况: 可能存在不指向任何对象的可能性需要在不同的时刻指向不同的对象(此时,你能 够改变指针的指向) 应该使用引用的情况: 如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,使用此时应使用 引用。 要首先好好理解指针和引用的区别 指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。 指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象, 但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给

指针练习题

编程题 1用指向数组的指针变量输出数组的全部元素 2 使用函数调用,形参为指针,实参为数组,把一个数组逆序存放在输出 练习题: 一判断题 1.指针是变量,它具有的值是某个变量或对象的地址值,它还具有一个地址值,这两个地址值是相等的。 2.指针的类型是它所指向的变量或对象的类型。 3.定义指针时不可以赋初值。 4.指针可以赋值,给指针赋值时一定要类型相同,级别一致。 5.指针可以加上或减去一个int型数,也可以加上一个指针。 6.两个指针在任何情况下相减都是有意义的。 7.数组元素可以用下标表示,也可以用指针表示。 8.指向数组元素的指针只可指向数组的首元素。 9.字符指针是指向字符串的指针,可以用字符串常量给字符指针赋值。 10.引用是一种变量,它也有值和地址值。 11.引用是某个变量的别名,引用是被绑定在被引用的变量上。 12.创建引用时要用一个同类型的变量进行初始化。 13.指针是变量,它可以有引用,而引用不能有引用。

二单选题 1.下列关于定义一个指向double型变量的指针,正确的是()。 A.int a(5);double *pd=a;B.double d(2.5),*pd=&d;C.double d(2.5),*pd=d;D.double a(2.5),pd=d; 2.下列关于创建一个int型变量的引用,正确的是()。 A.int a(3),&ra=a;B.int a(3),&ra=&a; C.double d(3.1);int &rd=d;D.int a(3),ra=a; 3.下列关于指针概念的描述中,错误的是()。 A.指针中存放的是某变量或对象的地址值 B.指针的类型是它所存放的数值的类型 C.指针是变量,它也具有一个内存地址值 D.指针的值是可以改变的 4.下列关于引用概念的描述中,错误的是()。 A.引用是变量,它具有值和地址值 B.引用不可以作数组元素 C.引用是变量的别名 D.创建引用时必须进行初始化 5.已知:int a[5],*p=a;则与++*p相同的是()。 A.*++p B.a[0] C.*p++ D.++a[0]

指向函数的指针详解

指向函数的指针 函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关: bool (*pf)(const string &,const string &); 这个语句将pf声明为指向函数的指针,它所指向的函数带有两个const string &类型的形参和bool 类型的返回值。 注意:*pf两侧的括号是必需的。 1.typedef简化函数指针的定义: 函数指针类型相当地冗长。使用typedef为指针类型定义同义词,可将函数指针的使用大大简化: Typedef bool (*cmpfn)(const string &,const string &); 该定义表示cmpfn是一种指向函数的指针类型的名字。该指针类型为“指向返回bool类型并带有两个const string 引用形参的函数的指针”。在要使用这种函数指针类型时,只需直接使用cmpfcn即可,不必每次都把整个类型声明全部写出来。 2.指向函数的指针的初始化和赋值 在引用函数名但又没有调用该函数时,函数名将被自动解释为指向函数的指针。假设有函数: Bool lengthcompare(const string &,const string &); 除了用作函数调用的左操作数以外,对lengthcompare的任何使用都被解释为如下类型的指针:

bool (*)(const string &,const string &); 可使用函数名对函数指针初始化或赋值: cmpfn pf1=0; cmpfn pf2=lengthcompare; pf1=legnthcompare; pf2=pf1; 此时,直接引用函数名等效于在函数名上应用取地址操作符: cmpfcn pf1=lengthcompare; cmpfcn pf2=lengthcompare; 注意:函数指针只能通过同类型的函数或函数指针或0值常量表达式进行初始化或赋值。 将函数指针初始化为0,表示该指针不指向任何函数。 指向不两只函数类型的指针之间不存在转换: string::size_type sumLength(const string &,const string &); bool cstringCompare(char *,char *); //pointer to function returning bool taking two const string& cmpFcn pf;//error:return type differs pf=cstringCompare;//error:parameter types differ pf=lengthCompare;//ok:function and pointer types match exactly 3.通过指针调用函数 指向函数的指针可用于调用它所指向的函数。可以不需要使用解引用

利用函数指针数组进行的键散转处理(4x4)

单片机 键盘接口电路 简介 Copyleft2009 by高飞电子经营部 P.S. 文档由高飞整理。能力有限,疏漏在所难免!这里说声抱歉了。 若对文档所描述的观点存在疑问,欢迎交流。 QQ:1275701567

键盘是单片机应用系统中不可缺少的输入设备,是实心人机对话的纽带,是操作人员控制干预单片机应用系统的主要手段。如用手机键盘发送短信息、遥控器键盘控制家用电器等。各种仪器仪表的小键盘系统,则可以显示各种信息。例如,数字式频率计、数字式扫频仪、数字式测量仪等。通过键盘向单片机应用系统输入数据和控制命令,实现对应用系统的认为控制,可以提高应用系统的灵活性。每种单片机应用系统的小键盘系统会实现不同的功能。比如,需要按键进行清零、预置值、改变测量范围等。这些功能是由一系列键盘电路通过编程实现的。因此,键盘在控制系统中得到了广泛的应用。本文档介绍了单片机系统中键盘接口电路及其相应的实现方式。 包含以下内容: ●键盘的组成和分类; ●键盘实现的硬件接口电路; ●4x4键盘与单片机的接口实例; ●二进制编码器键盘与单片机的接口实例。 1.1键盘设计的组成和分类 说说键盘的发展史。键盘发展至今,已经有100多年的时间。伴随着材料科学和电子技术的发展,键盘的物理构成和物理构造也不断变化发展。这些不同结构的键盘,各有特点,适用于不同的场合,但是控制方法都是类似的。 1.1.1键盘的物理结构 1.机械式结构键盘 机械式结构键盘,一般使用类似金属接触式开关的原理,实现触点导通或断开。在实际应用中,机械开关的结构形式很多。最常用的是交叉接触式。它的优点是结实耐用,缺点是不防水,敲击比较费力。交叉接触式机械开关,在单片机应用系统中最为常用。轻触开关也属于这一类。 2.电容式结构键盘 电容式结构键盘是一种类似电容式开关原理键盘。它通过按键改变电极的间距而产生电容量的变化,暂时形成震荡脉冲允许通过的条件。电容的容量是由介质、两极间的距离及两极的面积来决定的。当键帽按下时,两极的距离就发生变化,就引起电容容量发生变化。当参数设计合适时,按键时就有输出,而不按键就无输出。这个输出再经过整形放大,去驱动编码器。由于电容器无接触,所以这种按键在工作过程中不存在磨损、接触不良等问题,耐久性、灵敏度和稳定性都比较好。另外,为了避免电极间进入灰尘,电容式按键开关采用了密闭封装,比较便于保养。优良的特性带来的缺点就是代价高昂,标准PC键盘淘宝卖价不低于1500RMB!

指向函数的指针

指向函数的指针 c/c++ 2010-11-20 13:17:02 阅读41 评论0 字号:大中小订阅首先看这个程序: #include using namespace std; void max(int a, int b) { cout<<"now call max("<b?a:b; cout<

我曾经写过一个命令行程序,有很多命令,于是构着了一个结构的数组,大概是这样 struct{ char *cmd_name; bool (*cmd_fun)(); }cmd_info_list[MAX_CMD_NUM]; 程序中得到一个用户输入的命令字符串后,就匹配这个数组,找到对应的处理函数。 以后每次添加一个命令,只需要加个函数,然后在这个数组中加一个记录就可以了,不需要修改太多的代码。 这可以算是一种用法吧。呵呵。 Windows 中,窗口的回调函数就用到了函数指针。 用VC向导 New Projects ----> Win32 Application ----> A typical "Hello World!" application 其中的WndProc 是WNDPROC 类型的函数typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM); WndProc 作为窗口的回调函数,用来填充WNDCLASSEX 结构。 WNDCLASSEX wcex; wcex.lpfnWndProc = (WNDPROC)WndProc; void ListTraverse(LinkList L,void (*visit)(int)) { Link p; p=L->next; while(p) { visit(p->data); p=p->next; } return OK; } void print(int c) { printf("%d",c); } ListTraverse(L,print); 这算是个例子吧??? #include #include #include double Add (double x, double y) { return x+y; } double Sub (double x, double y) { return x-y; } double Mul (double x, double y)

如何用指向函数的指针替换switch-case

程序中当switch-case里面有很多分支,且每个分支有很多操作要做时,会花费很多时间,优化的方法有很多,比如将可能性大的放在前面,将case操作压缩,其实,最好的方法利用指向函数的指针解决问题,下面我们来看一个例子: 先来一个switch-case的模板: view plaincopy to clipboardprint? 1. #include 2. #include 3. 4. enum MsgType{ Msg1=1 ,Msg2 ,Msg3 ,Msg4 }; 5. 6. int menu() 7. { 8. int choice; 9. printf("1.ADD/n"); 10. printf("2.DEL/n"); 11. printf("3.SORT/n"); 12. printf("4.exit/n"); 13. printf("input your choice:/n"); 14. scanf("%d",&choice); 15. return choice; 16. } 17. 18. void ADD() 19. { 20. NULL; 21. // 22. } 23. 24. void DEL() 25. { 26. NULL; 27. // 28. } 29. 30. void SORT() 31. { 32. NULL; 33. // 34. } 35. 36. int main()

37. { 38. while(1) 39. { 40. switch(menu()) 41. { 42. case Msg1: 43. ADD(); 44. break; 45. case Msg2: 46. DEL(); 47. break; 48. case Msg3: 49. SORT(); 50. break; 51. case Msg4: 52. exit(0); 53. break; 54. default: 55. printf("input error/n"); 56. break; 57. } 58. } 59. return 0; 60. } 61. 62. 1. #include 2. #include 3. 4. void ADD(); 5. void DEL(); 6. void SORT();

指针函数与函数指针的区别

指针函数与函数指针的区别 一、 在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。 表示: float *fun(); float *p; p = fun(a); 注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。来讲详细一些吧!请看下面 指针函数: 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。 格式: 类型说明符* 函数名(参数) 当然了,由于返回的是一个地址,所以类型说明符一般都是int。 例如:int *GetDate(); int * aaa(int,int); 函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。 int * GetDate(int wk,int dy); main() { int wk,dy; do { printf(Enter week(1-5)day(1-7)\n); scanf(%d%d,&wk,&dy); } while(wk<1||wk>5||dy<1||dy>7); printf(%d\n,*GetDate(wk,dy));

指针数组函数练习(含参考答案).

作业(使用指针、数组、函数完成) 1. 编写一个通用函数,该函数可以实现判断:一个含有五位数字的整数是否是回文数。回文数的含义是从左向右与从右向左看,数是相同的。如:23732是回文数,而23564则不是。编写主程序调用该函数实现求所有5位数字中满足条件的数的个数。 #include int Judge(long num { int m,t,h,s,g; m=num/10000; t=(num-m*10000/1000; h=(num-m*10000-t*1000/100; s=(num-m*10000-t*1000-h*100/10; g=num-m*10000-t*1000-h*100-s*10; if((m==g&&(t==s return 1; else return 0; } void main( { int count=0; long i; for(i=10000;i<=99999;i++ if(Judge(i count++; printf("%d\n",count;

} 2.编写一个通用函数,该函数可以实现对数值型数组的倒序。倒序的含义是把数组的元素值前后颠倒。例数组:20,19,18,15,13,10倒序的结果为:10,13,15,18,19,20。编写主程序,数组初始化方式不限,并输出,然后调用该函数实现倒序后再输出倒序的结果。 #include #define N 6 void Transfer(double *b,int n { double temp; double *i=b; double *j=b+n-1; while(j>i { temp=*i; *i=*j; *j=temp; i++; j--; } } void main( { double array[N]={20,19,18,15,13,10}; int i; for(i=0;i printf("%.0f\t",array[i];

相关主题
文本预览
相关文档 最新文档