C程序设计 第6章指针.ppt
《C程序设计 第6章指针.ppt》由会员分享,可在线阅读,更多相关《C程序设计 第6章指针.ppt(60页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第6章章 指针指针6.1 指针的概念指针的概念6.2 变量与指针变量与指针6.3 数组与指针数组与指针6.4 字符串与指针字符串与指针6.5 函数与指针函数与指针6.6 返回指针值的函数返回指针值的函数6.7 指针数组和指向指针的指针指针数组和指向指针的指针6.8 引用引用6.1 指针的概念指针的概念l在高级语言编程中,面对的是变量名。而源在高级语言编程中,面对的是变量名。而源程序经过编译处理后,每一个变量在程序执程序经过编译处理后,每一个变量在程序执行前,将分配在指定的位置上。程序执行过行前,将分配在指定的位置上。程序执行过程中,计算机到与变量名对应的内存地址去程中,计算机到与变量名对应的
2、内存地址去访问放在那里的数据。访问放在那里的数据。l这种按变量的地址直接存取变量的方法称为这种按变量的地址直接存取变量的方法称为“直接访问直接访问”方式。方式。int a;a180011:FF2Ba=18;l还有一种方式,将一个变量的地址放在另一个变量还有一种方式,将一个变量的地址放在另一个变量中,这时存取变量,可通过存放地址的变量间接地中,这时存取变量,可通过存放地址的变量间接地访问存放变量的内存空间。访问存放变量的内存空间。int a=18;a180011:FF2B0011:FF2Bip这个存放地址的变量称为指针。6.2 变量与指针变量与指针l指针变量是一种特殊的变量,它和以前学过指针变量
3、是一种特殊的变量,它和以前学过的其他类型的变量的不同之处是:的其他类型的变量的不同之处是:用它来指用它来指向另一个变量。向另一个变量。l一般的一般的C+编译系统为每一个指针变量分配编译系统为每一个指针变量分配4个字节个字节的存储单元,用来存放变量的地址。的存储单元,用来存放变量的地址。6.2.1 定义指针变量定义指针变量l格式:格式:l类型类型*变量名变量名1;lint*ip;lchar*cp;6.2.2 建立指针建立指针l建立指针包括建立指针包括定义指针定义指针和和给指针赋初值给指针赋初值。l用用“&”操作符可以获取变量的地址。操作符可以获取变量的地址。int a=5;const int b
4、=3.14;int*ipa=&a;const int*ipb=&b;/常量指针常量指针,指向常变量,指向常变量int*const ipc=&a;/指针常量指针常量,指针本身是常量,指针本身是常量注意:注意:l常数是不可寻址的,但常变量可以。常数是不可寻址的,但常变量可以。lint*iptr=&23;/错错l不能用一个整数给一个指针变量赋初值。不能用一个整数给一个指针变量赋初值。int*iptr=2345;/错错6.2.3 间接引用指针间接引用指针l“*”是乘法,又可以用于定义指针,还可以用于指针的间接是乘法,又可以用于定义指针,还可以用于指针的间接引用(引用(“*”的第三种用途)。的第三种用途
5、)。int a=4;int*ip=&a;cout*ipendl;/间接引用指针间接引用指针l“*”放在可执行语句中的指针之前,称为间接引用操作符。放在可执行语句中的指针之前,称为间接引用操作符。l“*”放在指针定义中时,称为指针定义符。放在指针定义中时,称为指针定义符。l间接引用的指针既可用于右值,也可用于左值。间接引用的指针既可用于右值,也可用于左值。*ip=58;cout&ipendl;/输出:输出:58例例:输入输入a和和b两个整数,按先大后小的顺序输两个整数,按先大后小的顺序输出出a和和b(用指针变量处理用指针变量处理)。l#include lusing namespace std;l
6、int main()ll int*p1,*p2,*p,a,b;l cinab;/输入两个整数输入两个整数l p1=&a;/使使p1指向指向al p2=&b;/使使p2指向指向bl if(ab)/如果如果ab就使就使p1与与p2的值交换的值交换l l p=p1;/将将p1的指向与的指向与p2的指向交换的指向交换l p1=p2;l p2=p;l l couta=a b=bendl;l coutmax=*p1 min=*p2endl;l return 0;l6.2.4 指针变量的地址指针变量的地址l l指针也是变量,是变量就有内存地址,所指针也是变量,是变量就有内存地址,所指针也是变量,是变量就有内
7、存地址,所指针也是变量,是变量就有内存地址,所以指针也有地址。以指针也有地址。以指针也有地址。以指针也有地址。l#include lusing namespace std;lint main()ll int a=18;l int*ip=&a;l coutaendl;l coutipendl;l cout&aendl;l cout*ipendl;l cout&ipendl;l return 0;l结果:180 x22ff740 x22ff74180 x22ff70 6.2.5 指针运算指针运算l指针可以进行加减运算。指针可以进行加减运算。l指针加减整数的操作表示空间位置上的挪动,指针加减整数的操
8、作表示空间位置上的挪动,但是但是挪动的字节数与其数据类型相关挪动的字节数与其数据类型相关:对对float指针加指针加6实际增加了实际增加了24个字节。个字节。对对long int指针加指针加5实际增加了实际增加了20个字节。个字节。对对char指针减指针减7实际减少了实际减少了7个字节。个字节。对对double指针减指针减2实际减少了实际减少了16个字节。个字节。l同类型的指针可以相互赋值。同类型的指针可以相互赋值。6.2.6 指针作为函数参数指针作为函数参数l函数的参数不仅可以是整型、浮点型、字符函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是型等数据,还可以是指
9、针类型。它的作用是将一个变量的地址传送给被调用函数的形参。将一个变量的地址传送给被调用函数的形参。例例:l对输入的两个整数按大小顺序输出。对输入的两个整数按大小顺序输出。l要求用函数处理,而且用指针类型的数据作要求用函数处理,而且用指针类型的数据作函数参数。函数参数。l#include lusing namespace std;lvoid swap(int*p1,int*p2);/函数的作用是将函数的作用是将*p1的值与的值与*p2的值交换的值交换lint main()ll int*pointer_1,*pointer_2,a,b;l cinab;l pointer_1=&a;/使使point
10、er_1指向指向al pointer_2=&b;/使使pointer_2指向指向bl if(ab)/如果如果ab,使,使*pointer_1和和*pointer_2互换互换l swap(pointer_1,pointer_2);l coutmax=a min=bendl;l return 0;llvoid swap(int*p1,int*p2)ll int temp;l temp=*p1;l *p1=*p2;l *p2=temp;lint temp;temp=*p1;*p1=*p2;*p2=temp;0 x23ff6ca0 x23ff68bpointer_1=&a;pointer_2=&b;0
11、 x23ff6c0 x23ff68pointer_1pointer_20 x23ff6c0 x23ff68p1p2swap(pointer_1,pointer_2);6.3 数组与指针数组与指针6.3.1 数组名数组名l有如下声明:有如下声明:lint a5;l我们把我们把a称为数组,它是一些值的集合。下标称为数组,它是一些值的集合。下标和数组名一起使用,用于标识该集合中的某和数组名一起使用,用于标识该集合中的某个特定的值,如个特定的值,如a0表示数组表示数组a的第的第1个值,个值,a4表示第表示第5个值。个值。la4的类型是整型,但的类型是整型,但a的类型是什么?它所的类型是什么?它所表示的
12、又是什么?表示的又是什么?l一个合乎逻辑的答案是一个合乎逻辑的答案是a表示整个数组,但事实并非如此。表示整个数组,但事实并非如此。l在在C/C+中,几乎所有中,几乎所有使用数组名的表达式使用数组名的表达式里的数组名的里的数组名的值值值值是一个是一个指针常量指针常量指针常量指针常量,也就是,也就是数组第一个元素数组第一个元素数组第一个元素数组第一个元素的地址。它的类型的地址。它的类型取决于数组元素的类型:如果它们是取决于数组元素的类型:如果它们是int类型,那么数组名的类型,那么数组名的类型就是类型就是“指向指向int的指针常量的指针常量”即即“int*”。l例:例:l#include lusi
13、ng namespace std;lint main()ll int a5=1,2,3,4,5;l int b=a;ll注意:只有当数组名在表达式中使用时,编译器才为它产生注意:只有当数组名在表达式中使用时,编译器才为它产生一个指针常量,不要理解为数组名就是指针。一个指针常量,不要理解为数组名就是指针。编译错误:编译错误:invalid conversion from int*to intl只有在两种场合下,数组名不用指针常量来表示只有在两种场合下,数组名不用指针常量来表示就就是当数组名作为是当数组名作为sizeof操作符或单目操作符操作符或单目操作符&的操作数的操作数时。时。l对于对于int
14、 a5;lsizeof(a)返回整个数组的长度返回整个数组的长度l&a 返回一个指向数组返回一个指向数组a的指针,类型为的指针,类型为int(*)5,即指向有即指向有5个整型元素的一维数组的指针。个整型元素的一维数组的指针。l由上面也可看出,数组名并非就是指针。由上面也可看出,数组名并非就是指针。6.3.2 下标操作符下标操作符 l 实际上是实际上是变址运算符变址运算符。程序编译时,。程序编译时,C+编译系统编译系统会将其转换为会将其转换为*(x+i)的形式,的形式,x表示表示 前的操作数。前的操作数。如如ai *(a+i)l也就是说下标操作其实进行的就是指针运算,即将数也就是说下标操作其实进
15、行的就是指针运算,即将数组首元素的地址加上相对位移量,然后取该单元中的组首元素的地址加上相对位移量,然后取该单元中的内容。内容。l同理同理bij *(bi+j)*(*(b+i)+j)其含义后再讨论。其含义后再讨论。6.3.3 用指针操作数组用指针操作数组l前面讲了,一维数组前面讲了,一维数组a在表达式中值为数组首元素的在表达式中值为数组首元素的地址,类型为地址,类型为int*,而,而ai等同等同*(a+i),那么下面几,那么下面几个操作等价就很好理解了。个操作等价就很好理解了。lint*p=a;/a、p类型一致类型一致lail*(a+i)lpil*(p+i)l也就是说我们可以定义一个和数组首元
16、素类型一致也就是说我们可以定义一个和数组首元素类型一致的指针变量来操作数组。的指针变量来操作数组。l相应地第相应地第i个元素的地址:个元素的地址:l&aila+ilp+il&pil l注意:注意:la+;/lp+;/例:数组的求和例:数组的求和l#include lusing namespace std;lint main()ll int sum1=0,sum2=0,sum3=0,sum4=0,sum5=0;l int a=1,4,5,7,9,2;l int*p=a;l int size=sizeof(a)/sizeof(a0);/数组元素的个数数组元素的个数l for(int i=0;isi
17、ze;+i)/方法方法1l l sum1+=ai;l l for(int i=0;isize;+i)/方法方法2l l sum2+=pi;l l for(int i=0;isize;+i)/方法方法3l l sum3+=*(p+);l l p=a;l for(int i=0;isize;+i)/方法方法4l l sum4+=*(p+i);l l for(int i=0;isize;+i)/方法方法5l l sum5+=*(a+i);l l coutsum1 sum2 sum3 l sum4 sum5endl;l return 0;l6.3.2 用指针变量作函数参数接收数组地址用指针变量作函数参
18、数接收数组地址l前面已经多次强调:前面已经多次强调:数组名代表数组首元素数组名代表数组首元素的地址。用数组名作函数的参数,传递的是的地址。用数组名作函数的参数,传递的是数组首元素的地址。很容易推想:数组首元素的地址。很容易推想:用指针变用指针变量作函数形参,同样可以接收从实参传递来量作函数形参,同样可以接收从实参传递来的数组首元素的地址。的数组首元素的地址。例:将例:将10个整数按由小到大的顺序排列。个整数按由小到大的顺序排列。l#include lusing namespace std;lvoid select_sort(int*p,int n);lint main()ll int a10;
19、l coutenter the originl array:endl;l for(int i=0;iai;l coutendl;l select_sort(a,10);/函数调用,数组名作实参函数调用,数组名作实参l coutthe sorted array:endl;l for(int i=0;i10;i+)/输出输出10个已排好序的数个已排好序的数l coutai ;l coutendl;l return 0;llvoid select_sort(int*p,int n)/用指针变量作形参用指针变量作形参ll int k,t;l for(int i=0;in-1;i+)l l k=i;l
20、for(int j=i+1;jn;j+)l if(*(p+j)*(p+k)k=j;/用指针法访问数组元素用指针法访问数组元素l t=*(p+k);l *(p+k)=*(p+i);l *(p+i)=t;l l6.3.3 多维数组与指针多维数组与指针lC+语言语言实际上是把多维数组当成一维数组来处理实际上是把多维数组当成一维数组来处理的的。l比如,现在有一个比如,现在有一个int型的二维数组型的二维数组a34,计算机,计算机认为这是一个一维的数组认为这是一个一维的数组a3,数组的三个元素分,数组的三个元素分别是别是a0、a1和和a2。其中每个元素又是一个一维。其中每个元素又是一个一维数组,例如数组
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 第6章指针 指针
限制150内