您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > 21天学通C++-第八章-指针
联系方式:北京源智天下科技有限公司第八讲:指针杨章伟e-mail:jtclass@163.com1-2北京源智天下科技有限公司联系方式:课程内容安排•指针概述•指针运算•指针与数组•指针与函数•指针与字符串•指向指针的指针•综合练习•思考和习题1-3北京源智天下科技有限公司联系方式:指针概述•简单来说,指针是一个地址,其指向存储某一个数据的存储地址。此外,还有一个指针变量的概念,指针变量是一种特殊性质的变量。指针变量是把地址存放在一个变量中,然后通过先找出地址变量中的值(一个地址),再由此地址找到最终要访问的变量的方法,这就是指针变量及其访问方法,而地址变量就是指针。1-4北京源智天下科技有限公司联系方式:指针概述对于指针可以如此来理解,比如一个人要到某地去,不认识路,去问交警。然后交警把该地方的地址写在了一张纸上给了该问路人。那么交警写的地址就是指针,指向要去的地址,而那张纸就是指针变量,用于存储指针。例如,在内存中存储了一个变量a,其值为5,那么用通过指针访问该变量如图8-1所示。1-5北京源智天下科技有限公司联系方式:定义指针•指针是一个变量,在程序中使用时,必须先声明,后使用。在指针声明的同时也可以进行初始化。指针的定义指出了指针的存储类型和数据类型,定义的语法形式如下:•存储类型名数据类型*指针变量名•例如,下面定义了名为p1,p2和p3的三个不同类型指针。•int*p1;•staticint*p2;•char*p3;1-6北京源智天下科技有限公司联系方式:指针的运算指针运算是以指针变量所持有的地址值为运算量进行的运算。因此,指针运算的实质是地址的计算。由于指针是持有地址量的变量这一特性,指针的运算与普通变量的运算在种类上和意义上都是不同的。指针运算的种类是有限的,它只能进行算术运算、关系运算和赋值运算。1-7北京源智天下科技有限公司联系方式:指针的间接访问如果说明了一个指针,并使其值为某个变量的地址,则可以通过这个指针间接地访问在这个地址中存储的值。经过上面部分的学习已知,在C++语言中有两个有关指针的特别运算符:&运算符:为取地址运算符,&x的值为x的地址。*运算符:指针运算符,或指向运算符,也称间接运算符,*p代表p所指向的变量。由上可看出,利用指针来访问变量值需要使用间接访问运算符“*”。需要注意的是,在指针变量的定义和指针变量的引用中都有*p。但引用指针时的*p与定义指针变量时用的*p是有区别的,它们形式上有些相似,而含义是不同的。1-8北京源智天下科技有限公司联系方式:指针的算术运算•指针的算术运算是按C++语言地址计算规则进行的,这种运算与指针指向的数据类型有密切关系,也就是C++语言的地址计算与地址中存放的数据长度有关。设px和py是指向具有相同数据类型的一组若干数据的指针,n是整数,则指针可以进行的算术运算有如下几种:•px+n,px-n,px++,++px,•px--,--px,px-py1-9北京源智天下科技有限公司联系方式:指针的关系运算•与指针的算术运算类似,在两个指向相同类型变量的指针之间可以进行各种关系运算。两指针之间的关系运算表示它们指向的地址位置之间的关系,例如:•inta;•int*p=&a,*q=p;•若上面声明的两个指针作p==q运算,其结果为1(true),也即指针p、q指向同一个变量。两指针相等的概念是两指针指向同一位置。因此,假设数据在内存中的存储逻辑是由前向后,那么指向后方的指针大于指向前方的指针。也就是说,对于两指针p和q之间的关系表达式:•pq•若p指向位置在q指向位置的前方,则该表达式的结果值为1,反之为0。1-10北京源智天下科技有限公司联系方式:指针的赋值运算•当向指针变量赋值时,赋的值必须是地址常量或变量,不能是普通整数。指针赋值运算常见的有以下几种形式:•把一个变量的地址赋予一个指向相同数据类型的指针•把一个指针的值赋予相同数据类型的另外一个指针•把数组的地址赋予指向相同数据类型的指针1-11北京源智天下科技有限公司联系方式:指针与数组•指针在数组中使用较为频繁,事实上,由于数组名表示的是该数组的首地址,所以如果定义一个指针指向数组,则可如下例声明:•inta[10];•int*pa=a;•这个语句定义了一个指针pa,并把pa初始化为指向数组inta[10]的指针,即指针pa指向数组的第一个元素。这时,不需要使用取地址运算符“&”。上述声明方式与下面的语句等价:•inta[10];•int*pa=&a[0];1-12北京源智天下科技有限公司联系方式:指针与函数利用指针作函数参数,可以方便地实现地址传递。函数可以返回指针,指针也可以指向函数。该节指针与函数中,读者要掌握如下三个方面的内容:指针作为函数参数指针型函数函数指针1-13北京源智天下科技有限公司联系方式:语言中,可以定义一个字符数组,将字符串存放在该数组中,通过数组下标来访问所需的字符;也可以定义一个字符指针,通过指针的指向来访问所需的字符。如果要通过指针访问一个字符串,可以将这个指针指向此字符串,并利用指针的加1、减1操作实现对各个字符的访问。此外,C++提供了许多字符串处理的库函数,在前面一章数组中也提到过了,其中常用的有:strcat():字符串连接函数。strcmp():字符串比较函数。strcpy():字符串复制函数。strlen():字符串长度计算函数。1-14北京源智天下科技有限公司联系方式:指向指针的指针由于指针是一个变量,在内存中也占据一定的空间,具有一个地址,这个地址也可以利用指针来保存。因此,可以声明一个指针来指向它,这个指针称为指向指针的指针,也称为二级指针。一般来说,声明指向指针的指针的形式如下:存储类型数据类型**指针变量名例如,下面语句声明了一个指向指针的指针pp,其指向指针p。inti,*p=&i;int**pp=&p;1-15北京源智天下科技有限公司联系方式:综合练习•该范例将3个存储在变量中的数值进行降序排列,其使用到了引用作为函数的参数以及函数的调用。1-16北京源智天下科技有限公司联系方式:(int&a,int&b)//定义参数为引用的函数3{4intp;//定义整型变量5p=a;//交换两个数值6a=b;7b=p;//交换完成8}9voidexchange(int&a,int&b,int&c)//定义包含三个引用参数的函数10{11if(ab)//ab成立12fun(a,b);//交换a,b13if(ac)//ac成立14fun(a,c);//交换a,c15if(bc)//bc成立16fun(b,c);//交换b,c17}18voidmain()19{20inta,b,c;//定义整型变量21a=12;//整型变量初始化22b=639;23c=78;24exchange(a,b,c);//调用函数exchange25couta=a,b=b,c=cendl;//输出变量的值26}1-17北京源智天下科技有限公司联系方式:思考和习题•指针的概念如何理解?•在具体程序中,如何定义指针并进行指针初始化?•指针的运算主要包含哪几种?•数组指针与指针数组有何区别?其分别应用在什么地方?•指针作为函数参数时,如何进行参数传递?
本文标题:21天学通C++-第八章-指针
链接地址:https://www.777doc.com/doc-6125639 .html