第九章:指针概述指针是C语言中的一个重要概念,也是C语言的一个重要特色。正确而灵活地运用它,可以有效地表示复杂的数据结构;能动态分配内存;方便地使用字符串;在调用函数时能获得1个以上的结果;能直接处理内存单元地址等,这对设计系统软件是非常必要的。掌握指针的应用,可以使程序简洁、紧凑、高效。每一个学习和使用C语言的人,都应当深入地学习和掌握指针。可以说,不掌握指针就是没有掌握C的精华。地址和指针的概念变量的属性:名、值和地址变量的访问方式:直接访问、间接访问变量的”地址”称为该变量的“指针”指针变量是存放地址的变量变量的指针和指向变量的指针变量变量的指针就是变量的地址。存放变量地址的变量是指针变量,它用来指向另一个变量。为了表示指针变量和它所指向的变量之间的联系,在程序中用“*”符号表示“指向”。如果已定义i_pointer为指针变量,则(*i_pointer)是i_pointer所指向的变量。定义一个指针变量C语言规定所有变量在使用前必须定义,指定其类型,并按此分配内存单元。指针变量不同于整型变量和其他类型的变量,它是用来专门存放地址的,必须将它定义为“指针类型”。定义指针变量的一般形式为基类型*指针变量名;可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量。例:指针定义intmain(intargc,constchar*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];//-----------------------------------inti=10;//定义一个整型的变量int*i_pointer;//定义一个整型指针的变量(这个变量中存放的是指针)i_pointer=&i;NSLog(@%d,sizeof(i));NSLog(@%d,sizeof(i_pointer));NSLog(@%d,sizeof(int));NSLog(@%d,sizeof(int*));NSLog(@%d,i_pointer);NSLog(@%d,*i_pointer);NSLog(@%d,&i_pointer);//-----------------------------------[pooldrain];return0;}在定义指针变量时要注意两点:(1)指针变量前面的“*”表示该变量的类型为指针型变量(2)在定义指针变量时必须指定基类型指针变量的引用指针变量中只能存放地址(指针),不要将一个整数(或其他非地址类型的数据)赋给一个指针变量。有两个有关的运算符:(1)&:取地址运算符(2)*:指针运算符(或称“间接访问”运算符),取其指向的内容。例:通过指针变量访问整型变量intmain(intargc,constchar*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];//----------------------------------------inta,b;int*a_pointer,*b_pointer;a=100;b=10;a_pointer=&a;b_pointer=&b;NSLog(@%d,%d,a,b);NSLog(@%d,%d,*a_pointer,*b_pointer);//----------------------------------------[pooldrain];return0;}对&和*运算符再作说明如果已执行了语句a_pointer=&a;(1)&*a_pointer(2)*&a(3)(*a_pointer)++例:输入a和b两个整数,按先大后小的顺序输出a和bintmain(intargc,constchar*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];//----------------------------------------int*p1,*p2,a,b;scanf(%d%d,&a,&b);if(ab){p1=&b;p2=&a;}else{p1=&a;p2=&b;}printf(max=%d,min=%d,*p1,*p2);//----------------------------------------[pooldrain];return0;}指针变量作为函数参数函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。例:输入两个整数,交换变量的值voidswap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}intmain(intargc,constchar*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];//----------------------------------------inta,b;int*pointer_1,*poninter_2;scanf(%d%d,&a,&b);pointer_1=&a;poninter_2=&b;swap(pointer_1,poninter_2);NSLog(@%d%d,a,b);//----------------------------------------[pooldrain];return0;}例:输入a和b两个整数,按先大后小的顺序输出a和bvoidswap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}intmain(intargc,constchar*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];//----------------------------------------inta,b;int*pointer_1,*poninter_2;scanf(%d%d,&a,&b);pointer_1=&a;poninter_2=&b;if(ab){swap(pointer_1,poninter_2);}NSLog(@%d%d,a,b);//----------------------------------------[pooldrain];return0;}例:输入a、b、c这3个整数,按大小顺序排列voidswap(int*pt1,int*pt2){inttemp;temp=*pt1;*pt1=*pt2;*pt2=temp;}voidexchange(int*q1,int*q2,int*q3){if(*q1*q2){swap(q1,q2);}if(*q1*q3){swap(q1,q3);}if(*q2*q3){swap(q2,q3);}}intmain(intargc,constchar*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];//-----------------------------------inta,b,c,*p1,*p2,*p3;scanf(%d,%d,%d,&a,&b,&c);p1=&a;p2=&b;p3=&c;exchange(p1,p2,p3);NSLog(@%d,%d,%d,a,b,c);//-----------------------------------[pooldrain];return0;}小结在本章中介绍了指针的基本概念和初步应用。应该说明,指针是C语言中重要的概念,是C的一个特色。使用指针的优点:(1)提高程序效率;(2)在调用函数时变量改变了的值能够为主调函数使用,即可以从函数调用得到多个可改变的值;(3)可以动态存储分配。但是同时应该看到,指针使用实在太灵活,对熟练的程序员来说,可以利用它编写出颇有特色的、质量优良的程序,实现许多用其他高级语言难以实现的功能,但也十分容易出错,而且这种错误往往比较隐蔽。由于指针运用的错误可能会使整个程序遭受破坏,比如由于未对指针变量p赋值就向*p赋值,就可能破坏了有用的单元的内容。有人说指针是有利有弊的工具,如果使用指针不当,会出现隐蔽的、难以发现和排除的故障。因此,使用指针要十分小心谨慎,要多上机调试程序,以弄清一些细节,并积累经验。