第8章善于使用指针

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

8.1什么是指针8.2指针变量8.3通过指针引用数组8.4通过指针引用字符串8.5提高部分第8章善于使用指针P2108.1什么是指针在定义变量时,系统就给这个变量分配内存单元。编译系统根据程序中定义的变量类型,分配一定长度的空间。P2108.1什么是指针内存区的每一个字节有一个编号,这就是内存单元的“地址”在地址所标志的内存单元中存放数据。P210由于通过地址能找到所需的变量单元,我们可以说,地址指向该变量单元。在C语言中,将地址形象化地称为“指针”。意思是通过它能找到以它为地址的内存单元。8.1什么是指针P210inta,b;ab20002002a=3;3直接访问8.1什么是指针P210inta;3aa_pointer2000a_pointer=&a;间接访问定义特殊变量a_pointer2000通过a_pointer取值8.1什么是指针P210为了表示将数值3送到变量中,可以有两种表达方法:(1)将3直接送到变量a所代表的单元中(2)将3送到变量a_pointer所指向的单元(即a所代表的存储单元)指向就是通过地址来体现的假设a_pointer中的值是变量a的地址(2000),这样就在a_pointer和变量a之间建立起一种联系,即通过a_pointer能知道a的地址,从而找到变量a的内存单元一个变量的地址称为该变量的“指针”例如,地址2000是变量i的指针如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”a_pointer就是一个指针变量。指针变量就是地址变量,用来存放地址的变量,指针变量的值是地址(即指针)“指针”和“指针变量”是不同的概念可以说变量a的指针是2000,而不能说a的指针变量是2000指针是一个地址,而指针变量是存放地址的变量8.2指针变量8.2.1使用指针变量访问变量的例子8.2.2怎样定义指针变量8.2.3怎样引用指针变量8.2.4指针变量作为函数参数P2118.2.1使用指针变量访问变量的例子例8.1通过指针变量访问整型变量。P211#includestdio.hvoidmain(){inta,b;int*pointer_1,*pointer_2;a=100;b=10;pointer_1=&a;pointer_2=&b;printf(“a=%d,b=%d\n”,a,b);printf(“*pointer_1=%d,*pointer_2=%d\n”,*pointer_1,*pointer_2);}定义两个指针变量使pointer_1指向a直接输出变量a和b的值间接输出变量a和b的值#includestdio.hvoidmain(){inta,b;int*pointer_1,*pointer_2;a=100;b=10;pointer_1=&a;pointer_2=&b;printf(“a=%d,b=%d\n”,a,b);printf(“*pointer_1=%d,*pointer_2=%d\n”,*pointer_1,*pointer_2);}此处*与类型名在一起。此时共同定义指针变量此处*与指针变量一起使用。此时代表指针变量所指向的变量8.2.2怎样定义指针变量P212定义指针变量的一般形式为:类型*指针变量名;如:int*pointer_1,*pointer_2;int是为指针变量指定的“基类型”基类型指定指针变量可指向的变量类型如pointer_1可以指向整型变量,但不能指向浮点型变量8.2.2怎样定义指针变量P212下面都是合法的定义和初始化:float*pointer_3;char*pointer_4;inta,b;int*pointer_1=&a,*pointer_2=&b;*pointer_1=&a;错误pointer_3=&a;错误pointer_1=&a;正确pointer_3=2000;错误8.2.3怎样引用指针变量P214在引用指针变量时,可能有三种情况:给指针变量赋值。如:p=&a;引用指针变量指向的变量。如有p=&a;*p=1;则执行printf(“%d”,*p);将输出1引用指针变量的值。如:printf(“%o”,p);使p指向a*p相当于a以八进制输出a的地址8.2.3怎样引用指针变量P214(1)&取地址运算符。&a是变量a的地址(2)*指针运算符(“间接访问”运算符)如果:p指向变量a,则*p就代表a。k=*p;(把a的值赋给k)*p=1;(把1赋给a)例8.2输入a和b两个整数,按先大后小的顺序输出a和b。解题思路:用指针方法来处理这个问题。不交换整型变量的值,而是交换两个指针变量的值。#includestdio.hvoidmain(){int*p1,*p2,*p,a,b;scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(ab){p=p1;p1=p2;p2=p;}printf(“a=%d,b=%d\n”,a,b);printf(“%d,%d\n”,*p1,*p2);}abp1p2p59&a&b成立5,9↙#includestdio.hvoidmain(){int*p1,*p2,*p,a,b;scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(ab){p=p1;p1=p2;p2=p;}printf(“a=%d,b=%d\n”,a,b);printf(“%d,%d\n”,*p1,*p2);}abp1p2p59&a&b&b&a#includestdio.hvoidmain(){int*p1,*p2,*p,a,b;scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(ab){p=p1;p1=p2;p2=p;}printf(“a=%d,b=%d\n”,a,b);printf(“%d,%d\n”,*p1,*p2);}abp1p2p59&a&b&b&aa=5,b=99,5#includestdio.hvoidmain(){int*p1,*p2,*p,a,b;scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(ab){p=p1;p1=p2;p2=p;}printf(“a=%d,b=%d\n”,a,b);printf(“%d,%d\n”,*p1,*p2);}abp1p2p59&a&b&b&a可否改为p1=&b;p2=&a;?注意:a和b的值并未交换,它们仍保持原值但p1和p2的值改变了。p1的值原为&a,后来变成&b,p2原值为&b,后来变成&a这样在输出*p1和*p2时,实际上是输出变量b和a的值,所以先输出9,然后输出58.2.4指针变量作为函数参数P215例8.3题目要求同例8.2,即对输入的两个整数按大小顺序输出。要求用函数处理,用指针变量作函数参数。解题思路:将指向两个变量的指针变量(内放两个变量的地址)作为实参传递给形参的指针变量,在形参中通过指针交换两个变量的值#includestdio.hvoidmain(){voidswap(int*p1,int*p2);inta,b;int*pointer_1,*pointer_2;scanf(“%d,%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(“max=%d,min=%d\n”,a,b);}abpointer_159&a&bpointer_25,9↙voidswap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}abpointer_159&a&bpointer_2p1&ap2&b95voidswap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}voidswap(int*p1,int*p2){int*temp;*temp=*p1;*p1=*p2;*p2=*temp;}错!!!无确定的指向#includestdio.hvoidmain(){……if(ab)swap(a,b);printf(“max=%d,min=%d\n”,a,b);}voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}错!!!无法交换a,bab59xy5995如果想通过函数调用得到n个要改变的值:①在主调函数中设n个变量,用n个指针变量指②设计一个函数,有n个指针形参。在这个函数中改变这n个形参的值③在主调函数中调用这个函数,在调用时将这n个指针变量作实参,将它们的地址传给该函数④在执行该函数的过程中,通过形参指针变量,改变它们所指向的n⑤主调函数中就可以使用这些改变了值的变量例8.4企图通过改变指针形参的值来改变指针实参的值。不能实现#includestdio.hvoidmain(){……pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);……}voidswap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}调用结束后指向不变错!!!只交换形参指向例8.5输入3个整数a,b,c,要求按大小顺序将它们输出。用函数实现改变这3个变量的值。解题思路:采用例8.3的方法在函数中交换两个变量的值#includestdio.hvoidmain(){voidexchange(int*q1,int*q2,int*q3);inta,b,c,*p1,*p2,*p3;scanf(%d,%d,%d,&a,&b,&c);p1=&a;p2=&b;p3=&c;exchange(p1,p2,p3);printf(%d,%d,%d\n,a,b,c);}调用结束后不会改变指针的指向9,0,10↙voidexchange(int*q1,int*q2,int*q3){voidswap(int*pt1,int*pt2);if(*q1*q2)swap(q1,q2);if(*q1*q3)swap(q1,q3);if(*q2*q3)swap(q2,q3);}voidswap(int*pt1,int*pt2){inttemp;temp=*pt1;*pt1=*pt2;*pt2=temp;}交换指针指向的变量值9,0,10↙10,9,08.3通过指针引用数组P2208.3.1数组元素的指针8.3.2通过指针引用数组元素8.3.3用数组名作函数参数8.3.1数组元素的指针P220一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中)所谓数组元素的指针就是数组元素的地址可以用一个指针变量指向一个数组元素inta[10]={1,3,5,7,9,11,13,15,17,19};int*p;p=&a[0];等价于p=a;等价于int*p=a;或int*p=&a[0];注意:数组名a不代表整个数组,只代表数组首元素的地址。“p=a;”的作用是“把a数组的首元素的地址赋给指针变量p”,而不是“把数组a各元素的值赋给p”。8.3.2通过指针引用数组元素(1)下标法,用数组名加下标如a[i](2)指针法,即地址法。*(a+i)或*(p+i)(其中初值p=a)P221例8.6有一个数组存放10个学生的年龄,用不同的方法输出数组中的全部元素。解题思路:设整型数组a[10],可以用下面方法实现输出全部学生的年龄①用数组名加下标②通过数组名计算数组元素地址,找到元素③通过指针变量计算数组元素地址,找到元素④用指针变量先后指向各数组元素#includestdio.hvoidmain(){inta[10]={19,17,20,18,16,22,24,15,23,25};inti,*p=a;for(i=0;i10;i++)printf(“%d”,a[i]);printf

1 / 114
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功