文档库 最新最全的文档下载
当前位置:文档库 › 指针

指针

指针
指针

分类:C/C++

1.语言中变量的实质

要理解C指针,我认为一定要理解C中“变量”的存储实质,所以我就从“变量”这个东西开始讲起吧!

先来理解理解内存空间吧!请看下图:

内存地址→6789101112 13

-----------------------------------------------------------------

。。。||||||||.。

------------------------------- ----------------------------------

如图所示,内存只不过是一个存放数据的空间,就好像我的看电影时的电影院中的座位一样。每个座位都要编号,我们的内存要存放各种各样的数据,当然我们要知道我们的这些数据存放在什么位置吧!所以内存也要象座位一样进行编号了,这就是我们所说的内存编址。座位可以是按一个座位一个号码的从一号开始编号,内存则是按一个字节一个字节进行编址,如上图所示。每个字节都有个编号,我们称之为内存地址。好了,我说了这么多,现在你能理解内存空间这个概念吗?

我们继续看看以下的C、C++语言变量申明:

int I;

char a;

每次我们要使用某变量时都要事先这样申明它,它其实是内存中申请了一个名为i的整型变量宽度的空间(DOS下的16位编程中其宽度为二个字节),和一个名为a的字符型变量宽度的空间(占一个字节)。

我们又如何来理解变量是如何存在的呢。当我们如下申明变量时:

int I;

char a;

内存中的映象可能如下图:

内存地址→678 91011

1213

----------------------- -------------------------------------------

。。。||||||||.。

------------------------------------------------------------------

变量名|→i←|→a←|

图中可看出,i在内存起始地址为6上申请了两个字节的空间(我这里假设了int的宽度为16位,不同系统中int的宽度是可能不一样的),并命名为i. a在内存地址为8上申请了一字节的空间,并命名为a.这样我们就有两个不同类型的变量了。

2.赋值给变量

再看下面赋值:

i=30

a=‘t’

你当然知道个两个语句是将30存入i变量的内存空间中,将‘t’字符存入a变量的内存空间中。我们可以这样的形象理解啦:

内存地址→678910 11 1213

------------------------------------------------ -----------------------

。。。|30|‘t’||| ||.。

-------------------------------------------------------------------- ---

|→i←|→a←|

3.变量在哪里?(即我想知道变量的地址)

好了,接下来我们来看看&i是什么意思?

是取i变量所在的地址编号嘛!我们可以这样读它:返回i变量的地址编号。你记住了吗?

我要在屏幕上显示变量的地址值的话,可以写如下代码:

printf(“%d”,&i);

以上图的内存映象所例,屏幕上显示的不是i值30,而是显示i的内存地址编号6了。当然实际你操作的时,i变量的地址值不会是这个数了。

这就是我认为作为初学者们所应想象的变量存储实质了。请这样理解吧!

最后总结代码如下:

int main()

{

int i=39;

printf(“%d\n”,i); //①

printf(“%d\n”, &i);//②

}

现在你可知道①、②两个printf分别在屏幕上输出的是i的什么东西啊?

好啦!下面我们就开始真正进入指针的学习了。

二、指针是什么东西

想说弄懂你不容易啊!我们许多初学指针的人都要这样的感慨。我常常在思索它,为什么呢?其实生活中处处都有指针。我们也处处在使用它。有了它我们的生活才更加方便了。没有指针,那生活才不方便。不信?你看下面的例子。

这是一个生活中的例子:比如说你要我借给你一本书,我到了你宿舍,但是你人不在宿舍,于是我把书放在你的2层3号的书架上,并写了一张纸条放在你的桌上。纸条上写着:你要的书在第2层3号的书架上。当你回来时,看到这张纸条。你就知道了我借与你的书放在哪了。你想想看,这张纸条的作用,纸条本身不是书,它上面也没有放着书。那么你又如何知道书的位置呢?因为纸条上写着书的位置嘛!其实这张纸条就是一个指针了。它上面的内容不是书本身,而是书的地址,你通过纸条这个指针找到了我借给你的本书。

那么我们C,C++ 中的指针又是什么呢?请继续跟我来吧,看下面看一个申明一整型指针变量的语句如下:

int * pi;

pi是一个指针,当然我们知道啦,但是这样说,你就以为pi一定是个多么特别的东西了。其实,它也只过是一个变量而已。与上一篇中说的变量并没有实质的区别。不信你看下面图。

内存地址→6789101112 1314

--------------------------------------------------------------

...|30|‘t’||||| ||……

--------------------------------------------------- -----------

变量|→i←|→a←||→pi←|

(说明:这里我假设了指针只占2个字节宽度,实际上在32位系统中,指针的宽度是4个字节宽的,即32位。)由图示中可以看出,我们使用int *Pi申明指针变量;其实是在内存的某处申明一个一定宽度的内存空间,并把它命名为Pi.你能在图中看出pi与前面的i,a 变量有什么本质区别吗,没有,当然没有!pi也只不过是一个变量而已嘛!那么它又为什么会被称为指针?关键是我们要让这个变量所存储的内容是什么。现在我要让pi成为真正有意义上的指针。请接着看下面语句:

pi=&i;

你应该知道&i是什么意思吧!再次提醒你啦:这是返回i变量的地址编号。整句的意思就是把i地址的编号赋值给pi,也就是你在pi上写上i的地址编号。结果如下图所示:

内存地址→678910111213 14

------------------------------------------------------------------

...|30|‘t’|||6 |||……

----------------------------------------------- -------------------

变量|→i←|→a←||→pi←|

你看,执行完pi=&i;后,在图示中的系统中,pi的值是6.这个6就是i变量的地址编号,这样pi就指向了变量i了。你看,pi与那张纸条有什么区别?pi不就是那张纸条嘛!上面写着i的地址,而i就是那个本书。你现在看懂了吗?因此,我们就把pi称为指针。所以你要记住,指针变量所存的内容就是内存的地址编号!好了,现在我们就可以通过这个指针pi 来访问到i这个变量了,不是吗?。看下面语句:

printf(“%d”,*pi);

那么*pi什么意思呢?你只要这样读它:pi内容所指的地址的内容(嘻嘻,看上去好像在绕口令了),就pi这张“纸条”上所写的位置上的那本“书”——i .你看,Pi内容是6,也就是说pi指向内存编号为6的地址。*pi嘛!就是它所指地址的内容,即地址编号6上的内容了。当然就是30的值了。所以这条语句会在屏幕上显示30.也就是说printf(“%d”,*pi);

语句等价于printf (“%d”,i ),请结合上图好好体会吧!各位还有什么疑问,可以发Email:yyf977@https://www.wendangku.net/doc/4c14656613.html,.

到此为止,你掌握了类似&i ,*pi写法的含义和相关操作吗。总的一句话,我们的纸条就是我们的指针,同样我们的pi也就是我们的纸条!剩下的就是我们如何应用这张纸条了。最后我给你一道题:

程序如下

char a,*pa

a=10

pa=&a

*pa=20

printf( “%d”, a)

你能直接看出输出的结果是什么吗?如果你能,我想本篇的目的就达到了。好了,就说到这了。Happy to Study!在下篇中我将谈谈“指针的指针”即对int * * ppa;中ppa 的理解。

1.数组元素

看下面代码

int i,a[]={3,4,5,6,7,3,7,4,4,6};

for (i=0;i<=9;i++)

{

printf ( “%d”, a*i+ );

}

很显然,它是显示a 数组的各元素值。

我们还可以这样访问元素,如下

int i,a[]={3,4,5,6,7,3,7,4,4,6};

for (i=0;i<=9;i++)

{

printf ( “%d”,*(a+i) );

}

它的结果和作用完全一样

2. 通过指针访问数组元素

int i,*pa,a[]={3,4,5,6,7,3,7,4,4,6};

pa =a;//请注意数组名a直接赋值给指针pa

{

printf ( “%d”, pa*i+ );

}

很显然,它也是显示a 数组的各元素值。

另外与数组名一样也可如下:

int i,*pa,a[]={3,4,5,6,7,3,7,4,4,6};

pa =a;

for (i=0;i<=9;i++)

{

printf ( “%d”, *(pa+i) );

}

看pa=a即数组名赋值给指针,以及通过数组名、指针对元素的访问形式看,它们并没有什么区别,从这里可以看出数组名其实也就是指针。难道它们没有任何区别?有,请继续。

3. 数组名与指针变量的区别

请看下面的代码:

int i,*pa,a[]={3,4,5,6,7,3,7,4,4,6};

pa =a;

for (i=0;i<=9;i++)

{

printf ( “%d”, *pa );

pa++ ;//注意这里,指针值被修改

}

可以看出,这段代码也是将数组各元素值输出。不过,你把{}中的pa改成a试试。你会发现程序编译出错,不能成功。看来指针和数组名还是不同的。其实上面的指针是指针变量,而数组名只是一个指针常量。这个代码与上面的代码不同的是,指针pa在整个循环中,其值是不断递增的,即指针值被修改了。数组名是指针常量,其值是不能修改的,因此不能类似这样操作:a++.前面4,5节中pa[i],*(pa+i )处,指针pa的值是使终没有改变。所以变量指针pa与数组名a可以互换。

4. 申明指针常量

再请看下面的代码:

int i, a[]={3,4,5,6,7,3,7,4,4,6};

int * const pa=a;//注意const的位置:不是const int * pa,

{

printf ( “%d”, *pa );

pa++ ;//注意这里,指针值被修改

}

这时候的代码能成功编译吗?不能。因为pa指针被定义为常量指针了。这时与数组名a已经没有不同。这更说明了数组名就是常量指针。但是…

int * const a={3,4,5,6,7,3,7,4,4,6};//不行

int a[]={3,4,5,6,7,3,7,4,4,6};//可以,所以初始化数组时必定要这样。

以上都是在VC6.0上实验。

1 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与前两个式子又有什么不同呢?我下面就来具体分析它们的格式与语义吧!

2 const int * pi的语义

我先来说说const int * pi是什么作用(当然int const * pi也是一样的,前面我们说过,它们实际是一样的)。看下面的例子:

//*************代码开始***************

int i1=30;

int i2=40;

const int * pi=&i1;

pi=&i2;//4.注意这里,pi可以在任意时候重新赋值一个新内存地址

i2=80;//5.想想看:这里能用*pi=80;来代替吗?当然不能

printf( “%d”, *pi ) ;//6. 输出是80

//*************代码结束***************

语义分析:

看出来了没有啊,pi的值是可以被修改的。即它可以重新指向另一个地址的,但是,不能通过*pi来修改i2的值。这个规则符合我们前面所讲的逻辑吗?当然符合了!

首先const修饰的是整个*pi(注意,我写的是*pi而不是pi)。所以*pi是常量,是不能被赋值的(虽然pi所指的i2是变量,不是常量)。

其次,pi前并没有用const 修饰,所以pi是指针变量,能被赋值重新指向另一内存地址的。你可能会疑问:那我又如何用const 来修饰pi呢?其实,你注意到int * const pi中const 的位置就大概可以明白了。请记住,通过格式看语义。哈哈,你可能已经看出了规律吧?那下面的一节也就没必要看下去了。不过我还得继续我的战斗!

3 再看int * const pi

确实,int * const pi与前面的int const * pi会很容易给混淆的。注意:前面一句的const 是写在pi前和*号后的,而不是写在*pi 前的。很显然,它是修饰限定pi的。我先让你看例子:

//*************代码开始***************

int i1=30;

int i2=40;

int * const pi=&i1;

//pi=&i2; 4.注意这里,pi不能再这样重新赋值了,即不能再指向另一个新地址。

//所以我已经注释了它。

i1=80;//5.想想看:这里能用*pi=80;来代替吗?可以,这里可以通过*pi修改i1的值。

//请自行与前面一个例子比较。

printf( “% d”, *pi ) ;//6.输出是80

//***************代码结束*********************

语义分析:

看了这段代码,你明白了什么?有没有发现pi值是不能重新赋值修改了。它只能永远指向初始化时的内存地址了。相反,这次你可以通过*pi来修改i1的值了。与前一个例子对照一下吧!看以下的两点分析

1)pi因为有了const 的修饰,所以只是一个指针常量:也就是说pi值是不可修改的(即pi 不可以重新指向i2这个变量了)(看第4行)。

2)整个*pi的前面没有const 的修饰。也就是说,*pi是变量而不是常量,所以我们可以通过*pi来修改它所指内存i1的值(看5行的注释)

总之一句话,这次的pi是一个指向int变量类型数据的指针常量。

我最后总结两句:

1) 如果const 修饰在*pi前则不能改的是*pi(即不能类似这样:*pi=50;赋值)而不是指pi.

2) 如果const 是直接写在pi前则pi不能改(即不能类似这样:pi=&i;赋值)。

请你务必先记住这两点,相信你一定不会再被它们给搞糊了。现在再看这两个申明语句int const *pi和int * const pi时,呵呵,你会头昏脑胀还是很轻松惬意?它们各自申明的pi分别能修改什么,不能修改什么?再问问自己,把你的理解告诉我吧,可以发帖也可以发到我的邮箱(我的邮箱yyf977@https://www.wendangku.net/doc/4c14656613.html,)!我一定会答复的。

3)补充三种情况。

这里,我再补充以下三种情况。其实只要上面的语义搞清楚了,这三种情况也就已经被包含了。不过作为三种具体的形式,我还是简单提一下吧!

情况一:int * pi指针指向const int i常量的情况

//**********begin*****************

const int i1=40;

int *pi;

pi=&i1;//这样可以吗?不行,VC下是编译错。

//const int 类型的i1的地址是不能赋值给指向int 类型地址的指针pi的。否则pi 岂不是能修改i1的值了吗!

pi=(int* ) &i1;//这样可以吗?强制类型转换可是C所支持的。

//VC下编译通过,但是仍不能通过*pi=80来修改i1的值。去试试吧!看看具体的怎样。

//***********end***************

情况二:const int * pi指针指向const int i1的情况

//*********begin****************

const int i1=40;

const int * pi;

pi=&i1;//两个类型相同,可以这样赋值。很显然,i1的值无论是通过pi还是i1都不能修改的。

//*********end*****************

情况三:用const int * const pi申明的指针

//***********begin****************

int i

const int * const pi=&i;//你能想象pi能够作什么操作吗?pi值不能改,也不能通过pi修改i 的值。因为不管是*pi还是pi都是const的。

//************end****************

下篇预告:函数参数的指针传递,值传递,引用传递迷惑(以为a,b已经代替了x,y,对x,y的操作就是对a,b的操作了,这是一个错误的观点啊!)。

一、三道考题

开讲之前,我先请你做三道题目。(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?)1.考题一:程序代码如下:

void Exchg1(int x, int y)

{

int tmp;

tmp=x;

x=y;

y=tmp;

printf (“x=%d,y=%d\n”,x,y)

}

void main()

{

int a=4,b=6;

Exchg1 (a,b) ;

printf(“a=%d,b=%d\n”,a,b)

}

输出的结果:

x=____,y=____

a=____,b=____

问下划线的部分应是什么,请完成。

2.考题二:代码如下。

Exchg2(int *px, int *py)

{

int tmp=*px;

*px=*py;

*py=tmp;

print(“*px=%d,*py=%d\n”,*px,*py);

}

main()

{

int a=4;

int b=6;

Exchg2( &a,&b);

Print (“a=%d,b=%d\n”, a, b);

}

输出的结果为:

*px=____,*py=____

a=____,b=____

问下划线的部分应是什么,请完成。

3.考题三:

Exchg2(int &x, int &y)

{

int tmp=x;

x=y;

y=tmp;

print(“x=%d,y=%d\n”,x,y);

}

main()

{

int a=4;

int b=6;

Exchg2(a,b);

Print(“a=%d,b=%d\n”, a, b);

}

输出的结果:

x=____,y=____

a=____,b=____

问下划线的部分输出的应是什么,请完成。

你不在机子上试,能作出来吗?你对你写出的答案有多大的把握?

正确的答案,想知道吗?(呵呵,让我慢慢地告诉你吧!)

好,废话少说,继续我们的探索之旅了。

我们都知道:C语言中函数参数的传递有:值传递,地址传递,引用传递这三种形式。题一为值传递,题二为地址传递,题三为引用传递。不过,正是这几种参数传递的形式,曾把我给搞得晕头转向。我相信也有很多人与我有同感吧?

下面请让我逐个地谈谈这三种传递形式。

二、函数参数传递方式之一:值传递

1.值传递的一个错误认识

先看题一中Exchg1函数的定义:

void Exchg1(int x, int y)//定义中的x,y变量被称为Exchg1函数的形式参数

{

int tmp;

tmp=x;

x=y;

y=tmp;

printf(“x=%d,y=% d\n”,x,y)

问:你认为这个函数是在做什么呀?

答:好像是对参数x,y的值对调吧?

请往下看,我想利用这个函数来完成对a,b两个变量值的对调,程序如下:

void main()

{

int a=4,b=6;

Exchg1 (a,b)//a,b变量为Exchg1函数的实际参数。

/printf(“a=%d,b=%d\n”,a,b)

}

我问:Exchg1 ()里头的printf(“x=%d,y=%d\n”,x,y)语句会输出什么啊?

我再问:Exchg1 ()后的printf(“a=%d,b=%d\n”,a,b)语句输出的是什么?

程序输出的结果是:

x=6 ,y=4

a=4 ,b=6//为什么不是a=6,b=4呢?

奇怪,明明我把a,b分别代入了x,y中,并在函数里完成了两个变量值的交换,为什么a,b变量值还是没有交换(仍然是a==4,b==6,而不是a==6,b==4)?如果你也会有这个疑问,那是因为你跟本就不知实参a,b与形参x,y的关系了。

2.一个预备的常识

为了说明这个问题,我先给出一个代码:

int a=4;

int x;

x=a;

x=x+3;

看好了没,现在我问你:最终a值是多少,x值是多少?

(怎么搞的,给我这个小儿科的问题。还不简单,不就是a==4 x==7嘛!)

在这个代码中,你要明白一个东西:虽然a值赋给了x,但是a变量并不是x变量哦。我们对x任何的修改,都不会改变a变量。呵呵!虽然简单,并且一看就理所当然,不过可是一个很重要的认识喔。

3.理解值传递的形式

看调用Exch1函数的代码:

main()

{

int a=4,b=6;

Exchg1(a,b) //这里调用了Exchg1函数

printf(“a=% d,b=%d”,a,b)

}

Exchg1(a,b)时所完成的操作代码如下所示。

int x=a;//←

int y=b;//←注意这里,头两行是调用函数时的隐含操作

int tmp;

tmp=x;

x=y;

y=tmp;

请注意在调用执行Exchg1函数的操作中我人为地加上了头两句:

int x=a;

int y=b;

这是调用函数时的两个隐含动作。它确实存在,现在我只不过把它显式地写了出来而已。问题一下就清晰起来啦。(看到这里,现在你认为函数里面交换操作的是a,b变量或者只是x,y变量呢?)

原来,其实函数在调用时是隐含地把实参a,b 的值分别赋值给了x,y,之后在你写的Exchg1函数体内再也没有对a,b进行任何的操作了。交换的只是x,y变量。并不是a,b.当然a,b的值没有改变啦!函数只是把a,b的值通过赋值传递给了x,y,函数里头操作的只是x,y的值并不是a,b的值。这就是所谓的参数的值传递了。

哈哈,终于明白了,正是因为它隐含了那两个的赋值操作,才让我们产生了前述的迷惑(以为a,b已经代替了x,y,对x,y的操作就是对a,b的操作了,这是一个错误的观点啊!)。指向另一指针的指针

一、针概念:

早在本系列第二篇中我就对指针的实质进行了阐述。今天我们又要学习一个叫做指向另一指针地址的指针。让我们先回顾一下指针的概念吧!

当我们程序如下申明变量:

short int i;

char a;

short int * pi;

程序会在内存某地址空间上为各变量开辟空间,如下图所示。

内存地址→678910111213 1415

------------------- ------------------------------------------------------------------

…||||||||||

--------------------------------------- ----------------------------------------------

|short int i |char a||short int * pi|

图中所示中可看出:

i 变量在内存地址5的位置,占两个字节。

a变量在内存地址7的位置,占一个字节。

pi变量在内存地址9的位置,占两个字节。(注:pi 是指针,我这里指针的宽度只有两个字节,32位系统是四个字节)

接下来如下赋值:

i=50;

pi=&i;

经过上在两句的赋值,变量的内存映象如下:

内存地址→678910111213 1415

----- ---------------------------------------------------------------------------------

…|50|||6||||

----------- ---------------------------------------------------------------------------

|short int i |char a||short int * pi|

看到没有:短整型指针变量pi的值为6,它就是I变量的内存起始地址。所以,这时当我们对*pi进行读写操作时,其实就是对i变量的读写操作。如:

*pi=5;//就是等价于I=5;

你可以回看本系列的第二篇,那里有更加详细的解说。

二、指针的地址与指向另一指针地址的指针

在上一节中,我们看到,指针变量本身与其它变量一样也是在某个内存地址中的,如pi的内存起始地址是10.同样的,我们也可能让某个指针指向这个地址。

看下面代码:

short int * * ppi;//这是一个指向指针的指针,注意有两个*号

ppi=π

第一句:short int * * ppi;——申明了一个指针变量ppi,这个ppi是用来存储(或称指向)一个short int * 类型指针变量的地址。

第二句:&pi那就是取pi的地址,ppi=π就是把pi的地址赋给了ppi.即将地址值10赋值给ppi.如下图:

内存地址→678910111213 1415

------------------------------------------------------------------------ ------------

…|50|||6|10||

---------------------------------------------------------------------------------- --

|short int i|char a||short int * pi|short int ** ppi|

从图中看出,指针变量ppi的内容就是指针变量pi的起始地址。于是……

ppi的值是多少呢?——10.

*ppi的值是多少呢?——6,即pi的值。

**ppi的值是多少呢?——50,即I的值,也是*pi的值。

呵呵!不用我说太多了,我相信你应明白这种指针了吧!

三、一个应用实例

1. 设计一个函数:void find1(char array[],char search,char * pi)

要求:这个函数参数中的数组array是以0值为结束的字符串,要求在字符串array中查找字符是参数search里的字符。如果找到,函数通过第三个参数(pa)返回值为array字符串中第一个找到的字符的地址。如果没找到,则为pa为0.

设计:依题意,实现代码如下

void find1(char [] array, char search, char * pa)

{

int i;

for (i=0;*(array+i)!=0;i++)

{

if (*(array+i)==search)

{

pa=array+i

break;

}

else if (*(array+i)==0)

{

pa=0;

break;

}

}

}

你觉得这个函数能实现所要求的功能吗?

调试:

我下面调用这个函数试试。

{

char str[]={“afsdfsdfdf\0”};//待查找的字符串

char a=’d’;//设置要查找的字符

char * p=0;//如果查找到后指针p将指向字符串中查找到的第一个字符的地址。find1(str,a,p);//调用函数以实现所要操作。

if (0==p )

{

printf (“没找到!\n”);//1.如果没找到则输出此句

}

else

{

printf(“找到了,p=%d”,p);//如果找到则输出此句

}

}

分析:

上面代码,你认为会是输出什么呢?

运行试试。

唉!怎么输出的是:没有找到!

而不是:找到了,……。

明明a值为‘d’,而str字符串的第四个字符是‘d’,应该找得到呀!

再看函数定义处:void find1(char [] array,char search,char * pa)

看调用处:find1(str,a,p);

依我在第五篇的分析方法,函数调用时会对每一个参数进行一个隐含的赋值操作。整个调用如下:

array=str;

search=a;

pa=p;//请注意:以上三句是调用时隐含的动作。

int i;

for (i=0;*(array+i)!=0;i++)

{

if (* (array+i)==search)

{

break;

}

else if (*(array+i)==0)

{

pa=0;

break;

}

}

哦!参数pa与参数search的传递并没有什么不同,都是值传递嘛(小语:地址传递其实就是地址值传递嘛)!所以对形参变量pa值(当然值是一个地址值)的修改并不会改变实参变量p值,因此p的值并没有改变(即p的指向并没有被改变)。

(如果还有疑问,再看一看《第五篇:函数参数的传递》了。)

修正:

void find2(char [] array, char search, char ** ppa)

{

int i;

for (i=0;*(array+i)!=0;i++)

{

if (*(array+i)==search)

{

*ppa=array+i

break;

}

else if (*(array+i)==0)

{

*ppa=0;

break;

}

}

}

主函数的调用处改如下:

find2(str,a,&p);//调用函数以实现所要操作。

再分析:

这样调用函数时的整个操作变成如下:

search=a;

ppa=&p;//请注意:以上三句是调用时隐含的动作。

int i;

for (i=0;*(array+i)!=0;i++)

{

if (*(array+i) ==search)

{

*ppa=array+i

break;

}

else if (*(array+i)==0)

{

*ppa=0;

break;

}

}

看明白了吗?

ppa指向指针p的地址。

对*ppa的修改就是对p值的修改。

你自行去调试。

经过修改后的程序就可以完成所要的功能了。

看懂了这个例子,也就达到了本篇所要求的目的。

函数名与函数指针

一数调用

一个通常的函数调用的例子:

//自行包含头文件

void MyFun(int x);//此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[])

{

MyFun(10);//这里是调用MyFun(10);函数

return 0;

}

void MyFun(int x)//这里定义一个MyFun函数

水平一立定跳远教案

水平一(一年级)立定跳远课的设计 一、指导思想 以体育新课程标准为指针,以学生发展为目的,以学生的自主学习为突破口,根据教学内容设计不同的游戏,从学生的兴趣着手,避免学习过程的枯燥,让学生热爱活动的乐趣,同时让学生在活动中健身,在活动中合作,在活动中创新,在活动中享受,在活动中成长。 二、教材分析 立定跳远是低年级体育教学的重点内容,我在立定跳远单元中安排三个课时,本次课为第一课时,本次课教学重点是两脚同时起跳,并同时平稳落地,所以教学应着重解决两个问题: 1、培养学生正确的跳跃姿势,为儿童以后的发展与提高打下基础。 2、学会轻巧落地的方法,增加安全参与体育锻炼意识,提高自我保护的意识和能力。 三、学情分析 学生是学习的主体,要让学生能积极主动的学习,选择方法是很重要的。水平一的孩子自我控制和约束能力较差,如果一味跑和跳,会使学生感到厌烦,不愿意学。所以为了能使本课更符合学生的心理,将主要教学内容用游戏的方式来激发学生学习的积极性。 四、教学目标: 根据教材特点和学生学习能力及身心特点制定以下三个教学目标: 知识与技能目标:通过学习立定跳远,使90%以上的学生初步掌握立定跳远的动作方法。 体能目标:在教学过程中促进学生主动参与,发展学生的身体协调能力,提高跳跃能力。 情感目标:提高学生认真观察,培养学生相互协作的能力。 五、教学重难点: 重点:双脚起跳,双脚落地并屈膝缓冲。 难点:上下肢协调配合。 六、教法学法 教法:讲解示范法、引导法、探究法、指导法、比赛法、评价法等。 学法:小组合作学习、观察、模仿、相互学习来完成学练的目标。 七、教学程序: (一)、开始热身部分 常规导入后,开始热身,慢跑中模仿小兔子和小青蛙跳的动作后,在音乐的伴奏下跟随老师做健身操,使四肢得到充分的热身。 (二)、学习提高部分 通过“兔子引狼”的游戏让学生体会双脚同时起跳,同时落地并让学生知道双脚屈膝平稳落地。在此时通过游戏“高人,矮人,超人”让学生在游戏中学会了立定跳远的动作要领。在此时引出本节课立定跳远的动作要领,并做完整示范。在“蹬,摆”辅助练习中,让学生体会充分展体,四肢协调用力。经过以上的练习,让学生挑战跳过不同高度的海绵垫,激发学生的练习积极性。最后利用海绵垫做爬行接力,让学生四肢再次得到锻炼,再次活跃课堂气氛。 (三)、整理恢复部分

栈和队列

栈和队列 一、单项选择题(共59题) 1. 假定一个链式队列的队首和队尾指针分别用front和rear表示,每个结点的结构为: ,当出列时所进行的指针操作为() A. front = front->next; B. rear = rear->next; C. front->next = rear; rear = rear->next; D. front = front->next; front->next = rear; 答案:A 2. 向一个栈顶指针为HS的链栈中插入一个s所指结点时,则执行()。 A. HS->next = s; B. s->next = HS->next; HS->next = s; C. s->next = HS; HS = s; D. s->next = HS; HS = HS->next; 答案:C 3. 假定一个带头结点的循环链式队列的队首和队尾指针分别用front和rear表示,则判断队空的条件为()。 A. front == rear >next B. rear == NULL C. front == NULL D. front == rear 答案:D 4. 若让元素1, 2, 3, 4依次进栈,则出栈次序不可能出现()的情况。 A. 3, 2, 1, 4 B. 2, 1, 4, 3 C. 4, 3, 2, 1 D. 1, 4, 2, 3 答案:D 5. 假定一个顺序循环队列存储于数组a[N]中,其队首和队尾指针分别用f和r表示,则判断队满的条件为()。 A. (r - 1) % N == f B. (r + l) % N == f C. (f - 1) % N == r D. (f + l) % N == r 答案:B 6. 假定利用数组a[N]循环顺序存储一个队列,用f和r分别表示队首和队尾指针,并已知

基于WindowsCE系统的模拟时钟设计

基于WindowsCE系统的模拟时钟设计 【摘要】本文介绍了一种基于Windows CE 6.0操作系统的模拟时钟的设计方法,该设计以三星公司的S3C2440为核心,基于MFC编程,实现了钟面上时分秒针的实时显示。本设计编译生成的.exe文件可做为Windows CE系统的一个应用程序使用。 【关键词】ARM;S3C2440;Windows CE;模拟时钟 1.引言 随着科学技术的发展,嵌入式设备广泛应用于商业管理和工业控制等领域。本设计以ARM9嵌入式微处理器S3C2440为核心,基于MFC编程,在开发板的液晶显示屏上显示模拟时钟,实现了时分秒针的实时显示。 2.硬件平台 本设计以ARM9嵌入式微处理器S3C2440开发板为核心,主要利用S3C2440内置的RTC模块,通过读取系统时间来实时绘制时针,实现模拟时钟的实时走动。 3.软件设计 3.1 对话框设计 建立工程之后,在Resource View中设计模拟时钟的界面,选定一个与S3C2440触摸屏相符的对话框界面。模拟时钟的显示用程序实现,在对话框下方放置从Toolbox中选择的控件。本设计总共用到九个控件:对话框控件,显示时分秒的静态文本控件,用于显示数字的动态控件,更改时间的控件和确定控件等。 3.2 程序设计 首先添加一个OnTimer()函数读取系统时间并用作计时器的消息处理函数,用于通知moniDlg类中的画表盘刻度和指针的函数重新绘图。添加设置时间按钮函数,用于导出软键盘,设置时间;确认按钮函数用于关闭软键盘,此时屏幕刷新。 3.2.1 表盘刻度画法 在moniDlg类中添加画表盘刻度的函数。程序创建两种画笔,设置不同的颜色和粗细,来区分整点时刻和分点时刻。 由于S3C2440开发板显示屏默认的原点在左上角,根据S3C2440触摸屏的大小确定圆心位置,这样就确定了表盘的位置,表盘上的刻度都在以圆心为中心的圆环上。其坐标可以通过三角函数推导出来。设圆心坐标为(X,Y),半径为R,表盘上其他点的坐标为(X1,Y1),该点与圆心X轴夹角为A(0~360度),该点坐标为(X1=X+RcosA,Y1=Y+RsinA)。 由于我们习惯上使用逆时针的角度,而表针是顺时针转动,即在S3C2440上,坐标跟我们实际用到的坐标方向不同,所以我们应先算出从12点开始的每个刻度的正余弦值,即有60个数组元素的正余弦数组,为计算每个刻度跟时分秒针在表盘中的位置做准备。校正后的角度值,按顺时针重新排列三角函数值,得到如下正余弦数组: 时钟表盘画法流程图:见图1。 画表盘核心代码: 3.2.2 指针画法 在moniDlg类中添加刻画指针的函数。时分秒针主要用长短和粗细区分,亦

指针式万用表测试技巧

指针式万用表测试技巧 指针式万用表测试技巧 指针式万用表测试前,首先把万用表放置水平状态并视其表针是否处于零点(指电流、电压刻度的零点),若不在,则应调整表头下方的“机械零位调整”,使指针指向零点。正确选择万用表上的测量项目及量程开关。如已知被测量的数量级,则就选择与其相对应的数量级量程。如不知被测量值的数量级,则应从选择最大量程开始测量,当指针偏转角太小而无法精确读数时,再把量程减小。一般以指针偏转角不小于最大刻度的20%为合理量程。 电压表使用 万用表并接在被测电路上,在测量直流电压时,应注意被测点电压的极性,即把红表笔接电压高的一端,黑表笔接电压低的一端。如果不知被测电压的极性,可按前述测电流时的试探方法试一试,如指针向右偏转,则可以进行测量;如指针向左偏转,则把红、黑表笔调换位置,方可测量。测电路的内阻很大,就要求电压表的内阻更大,才会使测量精度高。此时需换用电压灵敏度更高(内阻更大)的万用表来进行测量。在测量交流电压时,不必考虑极性问题,只要将万用表并接在被测两端即可。另外,一般也不必选用大量程档或选高电压灵敏度的万用表。交流电源的内阻都比胶小。值得注意的是被测交流电压只能是正弦波,其频率应小于或等于万用表的允许工作频率,否则

就会产生较大误差。不要在测较高的电压(如220v)时拨动量程选择开关,以免产生电弧,烧坏转换开关关的触点。在测量大于或等于100v的高电压时,必须注意安全最好先把—支表笔固定在被测电路的公共然后用另一支表笔去碰触另——端测试点。如果量程不够,需换另外档测量另外万用表只适宜测音量频电平,如电路上有直流电压,还必须串接一只0.1uF/450V电容器将直流隔断后再测量,在测量有感抗的电路中的电压时,必须在测量后先把万用表断开再关电源。不然会在切断电源时,因为电路中感抗元件的自感现象,会产生高压而可能把万用表烧坏。 电流表使用 万用表串接在被测电路中时,应注意电流的方向。即把红表笔接电流流入的一端,黑表笔接电流流出的一端。如果不知被测电流的方向,可以在电路的一端先接好一支表笔,另一支表笔在电路的另—端轻轻地碰一下,如果指针向右摆动,说明接线正确;如果指针向左摆动(低于零点),说明接线不正确,应把万用表的两支表笔位置调换。在指针偏转角大于或等于最大刻度20%时,尽量选用大量程档。因为量程愈大,分流电阻愈小,电流表的等效内阻愈小,这时被测电路引入的误差也愈小。在测大电流(如500mA)时,千万不要在测量过程中拨动量程选择开关,以免产生电弧,烧坏转换开关的触点。

落枕 扭腰(按一个穴位搞定)

一、落枕: 落枕多因夜间睡觉时姿势不当或颈部受风寒所引起。患者经常是头一天晚上睡觉时脖子还好好的,但一觉醒来,便发现脖子酸痛,不能转动,影响工作和日常生活,使人十分痛苦。 这时,只要你按摩特定的“落枕穴”,问题就可以迎刃而解了。 “落枕穴”位于人体的手背上,中指和食指相对的掌骨之间,两指骨尽头起,向外一拇指宽处。按压时,用食指或中指的指腹侧面,用较大力气来回按压。双手皆要按压。 二、闪腰: 闪腰在医学上称为急性腰扭伤,是一种常见病,多由姿势不正、用力过猛、超限活动及外力碰撞等造成软组织受损所致。闪腰时可按摩“上仙穴”,非常显效。 “上仙穴”位于第五腰椎正下方凹处。人体双侧肋弓下缘连线与脊柱的交点对应的是第二腰椎,只要向下再数三个突起就是第五腰椎了。按压时,用一指腹尖端压住穴位,逐渐用力,旋转按压。 此穴对慢性腰部疼痛也非常有效。

三、鼻衄: 鼻衄俗称流鼻血,在天气干燥时常有发生。发生鼻衄时除了低头、用冷毛巾湿敷头部等外,还 可以按压“止血点”来加快止血。 “止血点”位于面部正中线与发际交界处上一拇指宽处。按压时,用一指腹尖端压住穴位,逐渐用 力,旋转按压。 以上各法只适用于家庭日常应用,请读者酌情使用,并尽快到正规医院就诊。 治疗落枕的穴位及刺激方法 治疗落枕时,可刺激天柱穴、大杼穴、大椎穴、完骨穴、肩井穴,即可见效。这里仅介绍其中 的天柱穴、大杼穴的找法。 先摸到枕部最突出之处(枕外粗隆),在往下摸,则有凹陷。这就是我们所说的“后颈窝”,天柱穴就在后颈窝往下2厘米处,脖子两侧直向筋肉的外缘上,一压,会有强痛。 脖子往前倾,从枕部往脖子后侧摸,颈项底部有大块凸骨(第七颈椎骨)。从它的下一个凸骨(第一胸椎骨)和下两个凸骨(第二胸椎骨)之间起,再往左右二指宽处,就是大杼穴。 治疗落枕时,用绑好的5、6支牙签连续刺激这些穴道即可。 对治疗落枕十分有效的落枕穴 落枕穴是治疗睡觉时落枕的特效穴道,因而命名为落枕穴。 落枕穴在手背上。在手背上食指和中指的骨之间,用手指朝手腕方向触摸,从骨和骨变狭的手指尽头之处起,大约一指宽的距离上,一压,有强烈压痛之处,就是落枕穴。 用食指指腹,或圆珠笔头(不是笔尖)按在此穴上,稍微用力刺激它,落枕的脖子便会变得轻 松多了。 落枕是指人在睡觉或外伤后突感颈部肌肉疼痛,尤以头颈部转动时更甚,引起落枕的原因有:

指针测试题

C++测试(指针) 学号姓名成绩 一、选择题(每题1.5分,共24分) 1.语句int a=10,*point=&a;其值不为地址。 A. point B. &a C. &point D. *point 2.若p为指针变量,y为变量,则y = *p++;的含义是 A.y=*p;p++ B.y=(*p)++ C.y=p;p++ D.p++;y=*p 3.语句char str[]=?visual C++?;char *p=str;则p的值为 A. ?visual C++? B.str的首地址 C. \n D.?v? 4.设有说明语句char *s[]={?student?,?Teacher?,?Father?,?Month?}, *ps=s[2];执行语句:cout<<*s[1]<<’,’<next=&b; D.(*p).next=q; 9.下面正确的语句是 A. int a[3][4],(*p)[4]; p=a; B. int a[3][4],*p[4]; p=a; C. int a[3][4],*p; p=a; D. int a[3][4],**p;*p=a; 10.下面不正确的语句是 A.float *p;p=new float[3]; B. int *p;p=new int[3](1,2,3); C. float *p;p=new float(3); D. int (*p)[4];p=new int[3][4]; 11.设有函数定义:int f1(void){return 100,150;}调用函数f1()时, A.函数返回值100 B. 函数返回值150 C. 函数返回二个值100和150 D. 语句return 100,150;语法错. 12.设有语句:int fun(char *,int &);char str[100];int k;则对函数fun的正确的调用形式是 A.fun(str,&k) B.fun(str,k) C.fun(str[100],k) D.fun(str, &k) 13.数组作为函数的形参时,把数组名作为实参,传递给函数的是 A.该数组的首地址 B. 该数组的元素个数 C. 该数组中的各元素值 D. 该数组的大小 14.执行以下语句序列:则 enum {Sun,Mon,Tue,Wed,Thu,Fri,Sat}c1,c2; //A

以指代针治百病——指针点穴之配穴精华

以指代针治百病——指针点穴之配穴精华 1、肚子疼:点少府。 2、急救、通脊醒神:点人中穴。 3、两肋痛:点按蠡沟。 4、眼病:点按金门、申脉。 5、胸闷气短:拧脚面皮肤。 6、抽筋:哑门。 7、眼皮跳:鼻尖。 8、胃病:中脘。 9、口干:承浆。 10、便秘:调腹部和大肠经. 11、网球肘病、心脏病:尺泽、曲泽、少海、小海,左手按右手。 12、颈椎病:外耳廊、锁骨内源向里按直到肩井穴。 13、治疗不孕症和肩膀肌肉僵硬、酸痛:膀胱俞相关穴位。 14、降血压:耳门、大脚趾和二脚趾跟部四周、每个从下到脚指尖、神阙。 15、腰背疼:委中、承扶、天枢、神阙、人中治腰疼。 16、肩周炎:青灵、大包,肩反射区(涌泉上旁开二寸) 17、痛经:少府、三阴交、腹部调理。 18、晕车:翳风、劳宫、内关、外关。

19、手关节炎:太渊、劳宫、手部疏通。 20、偏头痛:至阴、头部疏通(胆经)。 21、头晕:劳宫,头昏:太冲、行间 22、崴脚:跗阳、跗阳上下有硬的地方。 23、咽炎:中府、云门、合谷、尺泽、鱼际、太溪。 24、腱鞘炎:劳宫穴,大拇指腱鞘炎,锁骨尖。 25、咳嗽:鱼际、合谷、中府、云门。 26、糠尿病:全身调理。 27、鼻炎:通天穴(四神聪旁)涌泉、太渊、鱼际。 28、抑郁症:心、肝、脾、胃是重点,全身调理。 29、遗精滑精:腰阳关、关元、膀胱、百会。 30、早泄:全身调理。 31、怕冷手脚凉:丰隆、解溪、条口、足三里。 32、乳腺增生:足三里、解溪、丰隆、乳中、乳根。 33、癫痫:肝、胆的病全身调理。 34、牛皮癣:脾的病全身调理。 35、老花眼:金门、申脉、行间、大脚趾根部外侧。 36、痛风:丰隆腿部疏通。禁吃蜂蜜和甜食。 37、半身不遂:主穴地基,全身调理。 38、失眠:神门、大陵、风市。 39、腿神经麻痹,四肢不灵活:环跳。

数据结构第3章 栈与队列习题

第3章栈与队列 一、单项选择题 1.元素A、B、C、D依次进顺序栈后,栈顶元素是,栈底元素是。 A.A B.B C.C D.D 2.经过以下栈运算后,x的值是。 InitStack(s);Push(s,a);Push(s,b);Pop(s,x);GetTop(s,x); A.a B.b C.1 D.0 3.已知一个栈的进栈序列是ABC,出栈序列为CBA,经过的栈操作是。 A.push,pop,push,pop,push,pop B.push,push,push,pop,pop,pop C.push,push,pop,pop,push,pop D.push,pop,push,push,pop,pop 4.设一个栈的输入序列为A、B、C、D,则借助一个栈所得到的序列是。 A.A,B,C,D B.D,C,B,A C.A,C,D,B D.D,A,B,C 5.一个栈的进栈序列是a,b,c,d,e,则栈的不可能的输出序列是。 A.edcba B.decba C.dceab D.abcde 6.已知一个栈的进栈序列是1,2,3,……,n,其输出序列的第一个元素是i,则第j个出栈元素是。 A.i B.n-i C.j-i+1 D.不确定 7.已知一个栈的进栈序列是1,2,3,……,n,其输出序列是p1,p2,…,Pn,若p1=n,则pi的值。 A.i B.n-i C.n-i+1 D.不确定 8.设n个元素进栈序列是1,2,3,……,n,其输出序列是p1,p2,…,p n,若p1=3,则p2的值。 A.一定是2 B.一定是1

C.不可能是1 D.以上都不对 9.设n个元素进栈序列是p1,p2,…,p n,其输出序列是1,2,3,……,n,若p3=1,则p1的值。 A.可能是2 B.一定是1 C.不可能是2 D.不可能是3 10.设n个元素进栈序列是p1,p2,…,p n,其输出序列是1,2,3,……,n,若p3=3,则p1的值。 A.可能是2 B.一定是2 C.不可能是1 D.一定是1 11.设n个元素进栈序列是p1,p2,…,p n,其输出序列是1,2,3,……,n,若p n=1,则p i(1≤i≤n-1)的值。 A.n-i+1 B.n-i C.i D.有多种可能 12.判定一个顺序栈S为空的条件为。 A.S.top= =S.base B.S.top!= S.base C.S.top!= S.base+S.stacksize D.S.top= = S.base+S.stacksize 13.判定一个顺序栈S为栈满的条件是。 A.S.top-S.base= =S.stacksize B.S.top= = S.base C.S.top-S.base!=S.stacksize D.S.top!= S.base 14.链栈与顺序栈相比有一个明显的优点,即。 A.插入操作方便B.通常不会出现栈满的情况 C.不会出现栈空的情况D.删除操作更加方便 15.最不适合用作链栈的链表是。 A.只有表头指针没有表尾指针的循环双链表 B.只有表尾指针没有表头指针的循环双链表 C.只有表尾指针没有表头指针的循环单链表 D.只有表头指针没有表尾指针的循环单链表 16.如果以链表作为栈的存储结构,则退链栈操作时。 A.必须判别链栈是否满B.判别链栈元素的类型 C.必须判别链栈是否空D.对链栈不作任何判别

中国古医指针点穴疗法第十九代传人张双振老师的独门降压方法视频

中国古医指针点穴疗法第十九代传人张双振老师的独门降压方法视频 独门的降压方法 1.降血压的穴位就两个,第一个就是大脚趾的第一个指节和第二个指节的连接处,就是我们说的脚趾窝上,是人体上最敏感的降压反射区,只要用力点按5分钟以上就有明显的降压效果。第二个是在大脚趾的外侧(颈椎哪里),只要用力点按5分钟以上就有明显的降压效果。 2.如果在外面,不方便按脚,还可以按耳朵内侧的降压沟,如果血压高的人,按着这里就有跳的感觉,等这里不跳了,血压就降下来了。这个穴位要10-20多分钟就能见效。可以作为平时的降压保健按。力度适中就行,只要每天按上20分钟,一般坚持一周血压就能降的很好了。

3.祖传降压操金刚指保身大法:把你的手伸起来,用你的大拇指尽量的搓动你的小指、无名指、中指和食指,由小指根到小指、无名指、中指和食指指尖,再到食指、中指、无名指和小指的指根,要用力搓动,刚开始一个手都不习惯,搓动的时候不仅好酸,你转个十几圈,可能三五圈,你会觉得手出汗了,重点在手心那块儿出汗。这是为什么呢?掌心实际是心包经上的劳宫穴,劳宫穴是排解心脏内部的毒素用的。如果是在经常做降压手指操,就等于是在排解心脏内部的毒素。你可以摸摸出的汗肯定是粘粘的,它跟一般的汗是不也一样的,你会感觉是从掌心沁出来的那种汗。黏汗和一般的汗有什么区别?黏汗就是心脏里身上的毒气,所以常年坚持,对血压调节会有非常好的效果。

以上方法是中国古医指针点穴疗法第十九代传人张双振老师的独门降 压方法,效果非常神奇。 古医指针点穴疗法,就是以指代针,意气相合,意到气到,以祛其疾。也就是说用意念和自己身体内家功(也叫内含功)的功法,最后用气到达指尖,针对经络和穴位祛病。

经穴区理论及应用

经穴区理论及应用 【摘要】“经穴区”应用理论,包含“经脉区”和“腧穴区”两方面内容,是五绝指针疗法在应用经络穴位治疗理论的基础上逐步发展和延伸的应用技术学说,是对中医经络穴位理论的全面应用经验的总结,主要涉及到了对络脉、浮络、孙络、孙孙络理论的认识、探讨与应用等问题。 【关键词】经穴区;经脉区;腧穴区;五绝指针疗法;穴位区;络脉;浮络;孙络;孙孙络 “经穴区”应用理论,是五绝指针疗法在应用经络穴位治疗理论的基础上逐步发展和延伸的应用技术学说,这种学说的理论形成,仍然没有离开中医经络学说的本质,完全是对中医经络穴位理论的全面应用而已;这个“经穴区”理论,又分为经脉区和腧穴区两方面内容,而这两方面的知识内容,都是中医经络、腧穴理论的实质内涵,也就是经络学中的络脉、浮络、孙络、孙孙络等理论。 1经脉区 1.1经脉区部位和区域大小的确定 经脉区是指以十二经脉及奇经八脉的某一条经脉为核心,向外、向两侧延伸扩展的部位;向外延伸扩展的纵深部位,一般来说在人体某两条相邻经脉的中间位置;如:任脉区,以任脉循行路线为核心,向两侧延伸到任脉循行路线与肾经循行路线相隔的中间位置;从任脉左侧与肾经相隔的中间位置到从任脉右侧与肾经相隔的中间位置,就是任脉的整个区域,所以,我们称这个区域为任脉区。每一条经脉区范围的大小,是根据某条经脉的循行路线与两侧相邻的另一条经脉循行路线所相隔的距离确定的,如果两条经脉循行路线相隔的距离较远,那么,同是从两条经脉相隔的中间位置为区域边缘,这个经脉区的范围就较大,反之,如果两条经脉循行路线相隔的距离较近,那么,这个经脉区的范围就较小。 1.2确定经脉区应用理论的依据 经脉区应用理论的形成,不外乎中医经络学中早就叙述的浮络、孙络、孙孙络问题;也是多年来很少有人应用和探讨的问题。甚至有人久久的应用而不知所以然。 清·喻嘉言《医门法律·明络脉之法·络脉论》说道:“十二经脉,前贤论之详矣,而络脉则未之及,亦缺典也。……十二经生十二络,十二络生一百八十系络,系络生一百八十缠络,缠络生三万四千孙络。自内而生出者,愈多则愈细小。” 《灵枢·刺节真邪》:“此必有横络。”或指较小的络脉。意为:络脉也称横络。

大班数学认识整点

大班数学《认识整点》大班数学《认识整点》 活动目标 1、基本掌握时钟的主要结构,了解分针和时针的运转关系 2、通过操作和游戏,认识整点。 活动准备 1、课件。 2、纸质小时钟若干。

3、小组操作材料 活动过程 1、认识时钟构造,了解分针与时针的运转关系 出示一个挂钟图(PPT) 师:今天我请来了一位生活中的好朋友,看,他是谁?你们在什么地方看到时钟的?你知道时钟有什么用吗?(时钟不停的走动,为人们显示时间,人们按照时钟上的时间来工作、学习和休息) 师:他是什么样的?(有数字有针,圆形) 师:看看钟面上有几个数字?( 1、2、3、4、5、6、7、8、9、10、11、12)他们是怎么排列的?哪个数字在最上面? 师:除了数字,钟面上还有什么?(两根指针)有几根?他们是怎么样的?

师:2根指针有什么特点呢?他们一样长吗?(一长一短)长的叫分针,短的叫时针。 小结:小朋友们观察得很仔细,原来时钟上有12个数字,还有2根指针,长的叫分针,短的叫时针。 师:告诉你们一个秘密,时针和分针天天在比谁走得快,仔细看,他们是怎么比的呢?(PPT展示)你发现了什么?分针走了多少?时针走了多少?引导幼儿观察,小结分针和时针是朝一个方向走的,分针走一圈,时针走一大格,这就是一小时。 2、看钟面,认识整点。 师:现在分针指在12,表示整点,时针指在1,是1点整,那这只钟是几点整了呢?告诉你们游戏时候一个口诀,分针指着12,时针指着几,就是几点整。 那你会拨3点整吗?请一位小朋友到上面来试一试。那你会拨7点整吗?请小朋友们自己试一试。

师:时钟不仅会走路,还会说话,他还会用声音来告诉我们几点了。你们听到了什么?几下?原来时钟用他的声音响几下来告诉我们是几点整了。下面我们来点挑战,听时钟的整点报时来拨几点钟,仔细听!你是怎么拨的?大家发现6点整有什么有趣的地方? 师:大家来比赛,我来做裁判,看谁拨得快,拨完就马上就举手。 师: 12点整,有没有跟他不一样的?大家觉得对不对呢?你们发现有什么有趣的地方? 师:接下来,我们用小手试一试画指针,看,这位小朋友在做什么?几点吃午饭?你会在这个钟面上面画11点整吗?他画的是11点整吗?为什么?长长的分针指在12,短短的时针指在11(起床7点整)我们再把他记录下来。 现在你们会拨整点了吗?有什么口诀?。 3、小组游戏 (1)看图片拨时间

水平形仪表对认读速度、误读率影响的程序设计

本科毕业论文 题目水平形仪表认读速度、误读率 的程序设计 专业安全工程 作者姓名李宗庆 学号2012201586 单位物理科学与信息工程学院 指导教师孟现柱 2016 年 5 月 教务处编

原创性声明 本人郑重声明:所提交的学位论文是本人在导师指导下,独立进行研究取得的成果。除文中已经引用的内容外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得聊城大学或其他教育机构的学位证书而使用过的材料。对本文的研究作出重要贡献的个人和集体,均在文中以明确的方式表明。本人承担本声明的相应责任。 学位论文作者签名:日期: 指导教师签名: 日期:

目录 前言 (1) 1.水平形仪表简介 (2) 1.1水平形仪表简介 (2) 1.2水平形仪表特点 (3) 1.3影响水平形仪表认读速度的因素 (3) 1.4影响水平形仪表误读率的因素 (5) 2.水平形仪表程序设计思路 (7) 2.1 C++软件简介 (7) 2.1.1 C++编程开发 (7) 2.1.2 C++语言优缺点 (7) 2.2程序设计目的 (8) 2.3程序设计要求 (8) 2.4程序设计 (8) 3. 水平形仪表程序设计代码 (11) 4. 水平形仪表程序改进建议 (31) 4.1 水平形仪表程序的不足 (31) 4.2 水平形仪表程序改进建议 (31) 结论 (32) 参考文献 (33) 致谢 (34)

摘要 本文运用人机工程学的基本原理和理论,对水平形仪表对认读速度、误读率的影响进行了研究。第一章是水平形仪表简介。第二章是水平形仪表程序设计思路。第三章是水平形仪表程序设计代码。第四章是水平形仪表程序改进建议。 关键词:水平形仪表;人机工程学;调查与分析

李春葆数据结构习题与解析(修订版)知识分享

李春葆编著:数据结构(C语言篇)――习题与解析(修订版) 清华大学出版社 一、绪论 选择题 1.数据结构是一门研究非数值计算的程序设计问题中计算机的1以及它们之间的2和运算等的学科。 1 A.数据元素 B.计算方法 C.逻辑存储 D.数据映像 2 A.结构 B.关系 C.运算 D.算法 2.数据结构被形式地定义为(K, R),其中K是1的有限集,R是K上的2有限集。 1 A.算法 B.数据元素 C.数据操作 D.逻辑结构 2 A.操作 B.映像 C.存储 D.关系 3.在数据结构中,从逻辑上可以把数据结构分成。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 4.线性结构的顺序存储结构是一种1的存储结构,线性表的链式存储结构是一种2的存储结构。 A.随机存取 B.顺序存取 C.索引存取 D.散列存取 5.算法分析的目的是1,算法分析的两个主要方面是2。 1 A.找出数据结构的合理性 B.研究算法中的输入和输出的关系 C.分析算法的效率以求改进 D.分析算法的易懂性和文档性 2 A.空间复杂度和时间复杂度 B.正确性和简单性 C.可读性和文档性 D.数据复杂性和程序复杂性 6.计算机算法指的是1,它必须具备输入、输出和2等5个特性。 1 A.计算方法 B.排序方法 C.解决问题的有限运算序列 D.调度方法 2 A.可执行性、可移植性和可扩充性 B.可行性、确定性和有穷性 C.确定性、有穷性和稳定性 D.易读性、稳定性和安全性 7.线性表的逻辑顺序与存储顺序总是一致的,这种说法。 A.正确 B.不正确 8线性表若采用链式存储结构时,要求内存中可用存储单元的地址。 A.必须连续的 B.部分地址必须连续的 C.一定是不续的D连续不连续都可以 9.以下的叙述中,正确的是。 A.线性表的存储结构优于链式存储结构 B.二维数组是其数据元素为线性表的线性表 C.栈的操作方式是先进先出 D.队列的操作方式是先进后出 10.每种数据结构都具备三个基本运算:插入、删除和查找,这种说法。 A.正确 B.不正确 填空题 1.数据逻辑结构包括三种类型、和,树形结构和图形结构合称为。 2.在线性结构中,第一个结点前驱结点,其余每个结点有且只有个前驱结点;最后一个结点后续结点,其余每个结点有且只有个后续结点。 3.在树形结构中,树根结点没有结点,其余每个结点有且只有个前驱结点;叶子结点没有结点,其余每个结点的后续可以。

张双振老师的独门点穴法

古医指针点穴疗法 第十九代传人张双振老师的独门降压方 独门的降压方法 1.降血压的穴位就两个,第一个就是大脚趾的第一个指节和第二个指节的连接处,就是我们说的脚趾窝上,是人体上最敏感的降压反射区,只要用力点按5分钟以上就有明显的降压效果。第二个是在大脚趾的外侧(颈椎哪里),只要用力点按5分钟以上就有明显的降压效果。 2.如果在外面,不方便按脚,还可以按耳朵内侧的降压沟,如果血压高的人,按着这里就有跳的感觉,等这里不跳了,血压就降下来了。这个穴位要10-20多分钟就能见效。可以作为平时的降压保健按。力度适中就行,只要每天按上20分钟,一般坚持一周血压就能降的很好了。 3.祖传降压操金刚指保身大法:把你的手伸起来,用你的大拇指尽量的搓动你的小指、无名指、中指和食指,由小指根到小指、无名指、中指和食指指尖,再到食指、中指、无名指和小指的指根,要用力搓动,刚开始一个手都不习惯,搓动的时候不仅好酸,你转个十几圈,可能三五圈,你会觉得手出汗了,重点在手心那块儿出汗。这是为什么呢?掌心实际是心包经上的劳宫穴,劳宫穴是排解心脏内部的毒素用的。如果是在经常做降压手指操,就等于是在排解心脏内部的毒素。你可以摸摸出的汗肯定是粘粘的,它跟一般的汗是不也一样的,你会感觉是从掌心沁出来的那种汗。黏汗和一般的汗有什么区别?黏汗就是心脏里身上的毒气,所以常年坚持,对血压调节会有非常好的效果。

以上方法是中国古医指针点穴疗法第十九代传人张双振老师的独门降压方法,效果非常神奇。 古医指针点穴疗法,就是以指代针,意气相合,意到气到,以祛其疾。也就是说用意念和自己身体内家功(也叫内含功)的功法,最后用气到达指尖,针对经络和穴位祛病。 肩周炎:同点清灵穴、大包穴 法如下: 腿疼点:鹤顶穴(膝盖骨正中央))上膝眼(左右各一穴)(膝盖骨上侧中点旁开一寸)下膝眼(左右各一穴)

指针习题-20

*Chap10_1 编写函数fun,对长度为7个字符的字符串,除首、尾字符外,将其余5个字符按ASCII码降序排列。 *Chap10_2 所谓藏头诗,就是将这首诗每一句的第一个字连起来,所组成的内容就是该诗的真正含义。编写一个程序,输入一首藏头诗(假设只有4句),输出其真实含义。 江雪 千山鸟飞绝, 万径人踪灭。 孤舟蓑笠翁, 独钓寒江雪。 “千万孤独” *Chap10_3 输入一个字符串和一个字符,如果该字符在字符串中,就从该字符首次出现的位置开始输出字符串中的字符。要求定义函数match(s, ch),在字符串s中查找字符ch,如果找到,返回第一次找到的该字符在字符串中的位置(地址);否则,返回空指针NULL。 **Chap10_4输入年份和天数,输出对应的年、月、日。要求定义和调用函数month_day ( year, yearday, *pmonth, *pday),其中year 是年,yearday是天数,*pmonth和*pday是计算得出的月和日。例如,输入2000和61,输出2000-3-1,即2000年的第61天是3月1日。

**Chap10_5 请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。 **Chap10_6 请编一个函数fun(char*s),该函数的功能是把字符串中的内容逆置。 **Chap10_7请编写一个函数void fun(char *tt,int pp[]),统计在tt字符串中“a”到“z”26个字母各自出现的次数,并依次放在pp所指数组中。 ***Chap10_8 输入10个学生的姓名,并按拼音字母由小到大的顺序输出。要求用指针数组实现。 ***Chap10_9 先输入一个正整数n,再输入任意n个整数,计算并输出这n个整数的和。要求使用动态内存分配方法为这n个整数分配空间。 ***Chap10_10 编写一个函数calc(f, a, b),用梯形公式求函数f(x)在[a, b]上的数值积分,其中a=0.0,b=1.0。

手指点穴疗法操作规范

手指点穴疗法操作规范 【概念】 点穴疗法是在患者体表穴位和特定的刺激线上,运用点、按、拍、掐、叩、捶等不同手法,促使机体的功能恢复正常,以防治疾病的一种方法。 【适应症】 本疗法对脊髓灰质炎、脑炎后遗症、脑性瘫痪有较好疗效,尤对急性腰扭伤、小关节紊乱效果显著。 【禁忌症】 对感染性疾病,肿瘤,以及肌肤破损、烫伤、正在出血的部位,不宜采用本疗法。 【用物准备】 75%酒精棉球,必要时准备屏风。 【操作步骤】 1.点法:掌指关节微屈、食指按于中指背侧,拇指抵于中指末节,小指、无名指握紧。操作时,医者以中指端快速点于选定的经络和穴位上,利用手腕和前臂的弹力迅速抬起,如此反复叩点。一般每秒2~3次。叩点时可采取一虚二实节律。即在每一节律中,虚点时力轻,速度快;实点时力重,速度慢。施用点法时,要求医者既要有灵活的弹力,又要有坚实的指力和强劲的臂力。只有弹力而无指力,其力

不能深透;只有指力而无弹力,易致局部损伤。因此,须指力与弹力结合,方能刚柔并济,恰到好处。点法有轻、中、重之分。轻叩只运用腕部的弹力,属弱刺激,作用偏于补,多用于小儿、妇女或年老体弱患者。中叩需运用肘部的弹力,属中刺激,平补平泻。重叩要运用肩部的弹力,强刺激,作用偏于泻,主要用于青壮年、体质强壮及临床表现为

“实证”的患者。点法适用于全身各部位。运用点法时,应掌握频率的快慢和位置的始终如一,不然会影响治疗效果。 2.按法:将拇指伸直,其余四指伸张或扶持于所按部位的旁侧。操作时,拇指端在穴位上,用力向下按压,指端不要在按的穴位上滑动或移位,否则易擦伤皮肤,属强刺激手法。 3.拍法:食指、无名指、小指并扰微屈,拇指与食指第二关节靠拢,虚掌拍打,以指腹、大小鱼际触及被拍打部位的皮肤。操作时,以肘关节为中心,腕关节固定或微动,肩关节配合,手掌上下起落拍打。切忌腕关节活动范围过大,以免手掌接触时用力不均。 4.掐法:以拇指或食指的指甲,在穴位上进行爪切,只适用于手指、足趾甲根和指、趾关节部。操作时,一手握紧患者应掐部位的腕、踝关节,以防止肢体移动,另一手捏起肢端,对准穴位进行爪切。掐法的轻重、频率应视患者的病情而定。爪切时力量不宜过重,避免掐伤皮肤。

平衡针灸38个图解穴位

平衡针灸38个图解穴位 平衡针灸38个图解穴位 1.升提穴 定位:此穴位于头顶正中,前发际正中10cm(5寸),后发际直上16cm(8寸)出,双耳尖2cm(1寸)处。 局部解剖:血管分布有帽状腱膜和左右颞浅动脉静脉,及左右枕动脉静脉吻合网,神经分布有枕大神经分支。 取穴原则:定位取穴。 针刺原则:定位取穴。 针刺特点:以针刺枕大神经分支或额神经分支出现的针感为宜。 针刺方法:针尖沿皮下骨膜外向前平刺4cm(2寸)左右,一只手向前进针,另一只手可摸着针尖不要露出体外。 针刺手法:采用滞针手法,待针体达到一定深度时,采用顺时针捻转6圈,然后再按逆时针捻转6—10圈后即可将针退

出。 针感:以局部强化性针感出现麻胀紧沉为主。(30分钟左右自动解除) 功能:升阳固托,益气固本,助阳止泻,穴健脾,调节内脏,抗衰老,增加机体免疫机能。 主治:脱肛,子宫脱垂,胃下垂等中气下陷性疾病为主。临床还用于治疗穴,穴,穴,遗尿,前列腺炎,前列腺肥大,肠炎,慢性肠炎,低血压,宫颈炎,穴炎,过敏性哮喘,慢性支气管炎,体质过敏,偏瘫等。 按语:升提穴是以主要部位功能命名的一个特定穴位。临床主要用于治疗内脏下垂,中气下陷性疾病为主。均有补气穴,穴穴之称。同时对生殖 泌尿系统,呼吸系统,神经系统,内分泌系统,运动系统都具有一定调节作用。是中医用于益气穴的首选穴位。亦可作为中老年人的保健穴位。还可作为一切慢性病的辅助穴位。对滞针后留下的针感一般30分钟自行解除。歌诀中提到的肠风相当于现代医学的肠炎。

歌诀:升提穴位头顶中,枕神分支额神经,向前平刺4厘米,穴早泻遗尿精,脱肛脱垂胃下垂,前列腺炎与肠风。 (三寸毫针向前平刺2寸,百会穴上一寸) 2.腰痛穴 定位:此穴位于前额正中。 局部解剖:分布内侧动静脉分支和三叉神经的滑车上神经,前额两侧均有眶上神经分布。 取穴原则:定位取穴,交叉取穴原则。 针刺特点:其刺以滑车上神经或左右刺以眶上神经出现的正为宜。 手法:针刺手法采用上下提插法,达到要求针感时,即可出针。单侧腰痛为平刺手法,不提插,对重症腰痛病人疼痛未完全控制,但在不发生晕针的情况下,可以留针。

第3章栈与队列习题参考答案

习题三参考答案 备注: 红色字体标明的是与书本内容有改动的内容。 一、选择题 1.在栈中存取数据的原则是( B )。 A.先进先出 B. 先进后出 C. 后进后出 D. 没有限制 2.若将整数1、2、3、4依次进栈,则不可能得到的出栈序列是( D )。 A.1234 B. 1324 C. 4321 D. 1423 3.在链栈中,进行出栈操作时(B )。 A.需要判断栈是否满 B. 需要判断栈是否为空 C. 需要判断栈元素的类型 D. 无需对栈作任何差别 4.在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize,则顺序栈的判空条件是( A )。 A.top==0 B.top==-1 C. top==maxSize D.top==maxSize-1 5.在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize。则顺序栈的判满的条件是( C )。 A.top==0 B.top==-1 C. top==maxSize D.top==maxSize-1 6.在队列中存取数据元素的原则是( A )。 A.先进先出 B. 先进后出 C. 后进后出 D. 没有限制 7.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判空条件是(A )。 A.front==rear B. front!=rear C. front==rear+1 D. front==(rear+1)% maxSize 8.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判满条件是(D )。 A.front==rear B. front!=rear C. front==rear+1 D. front==(rear+1)% maxSize 9.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首 和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的长度是(C )。 A.rear-front B. rear-front+1 C. (rear-front+maxSize)%maxSize D. (rear-front+1)%maxSize 10.设长度为n的链队列采用单循环链表加以表示,若只设一个头指针指向队首元素,则入队操作的时间复杂度 为( B )。 A.O(1) B.O(n) C.O(log2n) D.O(n2) 二、填空题 1.栈是一种操作受限的特殊线性表,其特殊性体现在其插入和删除操作都限制在表尾进行。允许插入和删除 操作的一端称为栈顶,而另一端称为栈底。栈具有后进先出的特点。

地磁场水平分量的测量

地磁场水平分量的测量 【摘要】: 地磁场水平分量(horizontal component of geomagnetic field):地磁场的总磁场强度矢量T在参考坐标系的XOY水平面上的投影,称为地磁场水平分量,通常用符号H表示。水平分量的数值在赤道附近最大,约为0.03~0.04mT,由赤道向两极数值逐渐减小,两极为零。地球上除高纬度地区以外,大部分地区地磁场水平分量是大致指北的,这个方向称为磁北。中国由南到北,水平分量逐渐减小,约从0.04到0.02mT。 【关键词】: 地磁场水平分量、亥姆霍兹线圈、正切电流 【引言】: 地磁场包括基本磁场和变化磁场两个部分。基本磁场 是地磁场的主要部分,起源于地球内部,比较稳定,属于 静磁场部分。变化磁场包括地磁场的各种短期变化,主要 起源于地球内部,相对比较微弱。地球变化磁场可分为平 静变化和干扰变化两大类型。行军、航海利用地磁场对指 南针的作用来定向。人们还可以根据地磁场在地面上分布 的特征寻找矿藏。地磁场的变化能影响无线电波的传播。 当地磁场受到太阳黑子活动而发生强烈扰动时,远距离通 讯将受到严重影响,甚至中断。假如没有地磁场,从太阳发出的强大的带电粒子流(通常叫太阳风),就不会受到地磁场的作用发生偏转而直射地球。在这种高能粒子的轰击下,地球的大气成份可能不是现在的样子,生命将无法存在。所以地磁场这顶“保护伞”对我们来说至关重要。 地磁场强度大约是0.5-0.6高斯,也就是5-6*E-5特斯拉(50-60μT)。 【实验目的】: 1.学习测量地磁场水平分量的方法 2.了解正切电流计的原理 3.学习分析系统误差的方法 【实验原理】: 亥姆霍兹线圈(Helmholtz coil)是一 种制造小范围区域均匀磁场的器件。由于亥 姆霍兹线圈具有开敞性质,很容易地可以将 其它仪器置入或移出,也可以直接做视觉观 察,所以,是物理实验常使用的器件。因德 国物理学者赫尔曼·冯·亥姆霍兹而命名。

相关文档