您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 第8章善于利用指针.
第8章善于利用指针8.1指针是什么8.2指针变量8.3通过指针引用数组8.4通过指针引用字符串8.5指向函数的指针8.6返回指针值的函数8.7指针数组和多重指针8.8动态内存分配与指向它的指针变量8.9有关指针的小结8.1指針是什么如果在程序中定义了一个变量,在对程序进行编译时,系统就会给该变量分配内存单元编译系统根据程序中定义的变量类型,分配一定长度的空间例如,VC++为整型变量分配4个字节,对单精度浮点型变量分配4个字节,对字符型变量分配1个字节8.1指针是什么内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。在地址所标识的内存单元中存放数据,这相当于旅馆房间中居住的旅客一样。由于通过地址能找到所需的变量单元,我们可以说,地址指向该变量单元。将地址形象化地称为“指针”务必弄清楚存储单元的地址和存储单元的内容这两个概念的区别例如:inti=3,j=6,k;printf(“%d”,i);通过变量名i找到i的地址2000,从而从存储单元读取3inti=3,j=6,k;k=i+j;从这里取3将9送到这里从这里取6直接存取inti=3,j=6,k;定义特殊变量i_pointer将i的地址存到这里间接存取i_pointer=&i;*i_pointer=50;50i200032000i_pointer*i_pointer20003直接存取间接存取为了表示将数值3送到变量中,可以有两种表达方法:(1)将3直接送到变量i所标识的单元中,例如:i=3;(2)将3送到变量i_pointer所指向的单元(即变量i的存储单元),例如:*i_pointer=3;其中*i_pointer表示i_pointer指向的对象指向就是通过地址来体现的假设i_pointer中的值是变量i的地址(2000),这样就在i_pointer和变量i之间建立起一种联系,即通过i_pointer能知道i的地址,从而找到变量i的内存单元由于通过地址能找到所需的变量单元,因此说,地址指向该变量单元将地址形象化地称为“指针”。意思是通过它能找到以它为地址的内存单元一个变量的地址称为该变量的“指针”例如,地址2000是变量i的指针如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”i_pointer就是一个指针变量。指针变量就是地址变量,用来存放地址的变量,指針变量的值是地址(即指针)“指针”和“指针变量”是不同的概念可以说变量i的指针是2000,而不能说i的指针变量是2000指针是一个地址,而指针变量是存放地址的变量8.2指针变量8.2.1使用指针变量的例子8.2.2怎样定义指针变量8.2.3怎样引用指针变量8.2.4指针变量作为函数参数8.2.1使用指针变量的例子例8.1通过指针变量访问整型变量。解题思路:先定义2个整型变量,再定义2个指针变量,分别指向这两个整型变量,通过访问指针变量,可以找到它们所指向的变量,从而得到这些变量的值。#includestdio.hintmain(){inta=100,b=10;int*pointer_1,*pointer_2;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);return0;}定义两个指针变量使pointer_1指向a使pointer_2指向b直接输出变量a和b的值间接输出变量a和b的值#includestdio.hintmain(){inta=100,b=10;int*pointer_1,*pointer_2;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);return0;}此处*与类型名在一起。此时共同定义指针变量此处*与指针变量一起使用。此时代表指针变量所指向的变量8.2.2怎样定义指针变量定义指针变量的一般形式为:类型*指针变量名;如:int*pointer_1,*pointer_2;int是为指针变量指定的“基类型”基类型指定指针变量可指向的变量类型如pointer_1可以指向整型变量,但不能指向浮点型变量8.2.2怎样定义指针变量下面都是合法的定义和初始化: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怎样引用指针变量在引用指针变量时,可能有三种情况:给指针变量赋值。如:p=&a;引用指针变量指向的变量。如有p=&a;*p=1;则执行printf(“%d”,*p);将输出1引用指针变量的值。如:printf(“%o”,p);使p指向a*p相当于a以八进制输出a的地址8.2.3怎样引用指针变量(1)&取地址运算符。&a是变量a的地址(2)*指针运算符(“间接访问”运算符)如果:p指向变量a,则*p就代表a。k=*p;(把a的值赋给k)*p=1;(把1赋给a)例8.2输入a和b两个整数,按先大后小的顺序输出a和b。解题思路:用指针方法来处理这个问题。不交换整型变量的值,而是交换两个指针变量的值。#includestdio.hintmain(){int*p1,*p2,*p,a,b;printf(“integernumbers:);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);return0;}abp1p2p59&a&b成立#includestdio.hintmain(){int*p1,*p2,*p,a,b;printf(“integernumbers:);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);return0;}abp1p2p59&a&b&b&a#includestdio.hintmain(){int*p1,*p2,*p,a,b;printf(“integernumbers:);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);return0;}abp1p2p59&a&b&b&a#includestdio.hintmain(){int*p1,*p2,*p,a,b;printf(“integernumbers:);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);return0;}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指针变量作为函数参数例8.3题目要求同例8.2,即对输入的两个整数按大小顺序输出。现用函数处理,而且用指针类型的数据作函数参数。解题思路:定义一个函数swap,将指向两个整型变量的指针变量作为实参传递给swap函数的形参指针变量,在函数中通过指针实现交换两个变量的值。#includestdio.hintmain(){voidswap(int*p1,int*p2);inta,b;int*pointer_1,*pointer_2;printf(pleaseenteraandb:);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);return0;}abpointer_159&a&bpointer_2voidswap(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.hintmain(){……if(ab)swap(a,b);printf(“max=%d,min=%d\n”,a,b);return0;}voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}错!!!无法交换a,bab59xy5995如果想通过函数调用得到n个要改变的值:①在主调函数中设n个变量,用n个指针变量指②设计一个函数,有n个指针形参。在这个函数中改变这n个形参的值③在主调函数中调用这个函数,在调用时将这n个指针变量作实参,将它们的地址传给该函数④在执行该函数的过程中,通过形参指针变量,⑤主调函数中就可以使用这些改变了值的变量例8.4对输入的两个整数按大小顺序输出。解题思路:尝试调用swap函数来实现题目要求。在函数中改变形参(指针变量)的值,希望能由此改变实参(指针变量)的值#includestdio.hintmain(){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);return0;}voidswap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}错!!!只交换形参指向注意:函数的调用可以(而且只可以)得到一个返回值(即函数值),而使用指针变量作参数,可以得到多个变化了的值。如果不用指针变量是难以做到这一点的。要善于利用指针法。例8.5输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现。解题思路:采用例8.3的方法在函数中改变这3个变量的值。用swap函数交换两个变量的值,用exchange函数改变这3个变量的值。#includestdio.hintmain(){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);return0;}调用结束后不会改变指针的指向voidexchange(int*q1,int*q2,int*q3){voidswap(int*pt1,int*pt2);if(*q1*q2)swap(q
本文标题:第8章善于利用指针.
链接地址:https://www.777doc.com/doc-2112648 .html