资源描述:
《C语言 程序设计 第7章 指针》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第7章指针【问题7】阅读下面程序,分析能否交换a和b中的内容。如果不能,问题出在哪里?应该如何解决?#includevoidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}voidmain(){inta=10,b=5;swap(a,b);printf("a=%d,b=%d",a,b);}函数采用按值传递方式,swap()函数中形参x、y交换,并不影响主函数中实参a和b的值。输出的结果为:a=10,b=5shortinta=11;floatx=3.45;shortintb;3.457.1指针和指针
2、变量的概念1.地址与直接访问变量a的地址变量占有的存储单元的起始地址就是该变量的地址。直接访问:根据变量名直接访问变量存储单元。整型变量b内存地址1001H1201H1204H1004H1301H整型变量a实型变量x……1304H变量11指针,就是内存单元的地址。一个变量的地址称为该变量的指针。变量的指针是个地址常量。变量的地址可以通过取地址运算符&得到。2.指针的概念整型变量b内存地址1001H1201H1204H1002H1301H整型变量a实型变量x113.45……1302H变量变量a的指针3.指针变量与间接访问指针变量是用于存放变量地址的变量&a
3、(1001H)11pa指针变量p指向变量a间接访问:通过指针变量p访问变量a的存储单元7.2指针变量的定义与引用7.2.1指针变量的定义类型说明符*指针变量名;inta,*p1;float*p2;char*p3;指针变量名不包括*指针变量所定义的类型应与所指向的变量类型一致。遵循标识符的命名规则。7.2.2指针变量的操作1.两个运算符(1)取地址运算符(&)&变量名(2)指针运算符(*)*指针变量名inta=5,*p1;p1=&a;*p1=8;将变量a的地址赋给指针变量p1。将8赋给指针变量p1指向的变量a2.指针变量的赋值(1)在定义指针变量时进行赋值
4、inta;int*p=&a;(2)通过赋值语句进行赋值inta,*p,*q;p=&a;q=p;给指针变量赋值时,只能是地址类型,而且两边的类型一定要匹配。在给指针变量赋地址值时,指针变量前不能加“*”号。3.指针变量的引用给指针变量赋值引用指针变量的值引用指针变量指向的变量的值inta,b,*p,*q;p=&a;q=p;b=*p;printf("%d",*p);给指针变量p赋值引用指针变量p的值引用指针变量p指向的变量a的值【例7.1】输入任意两个整数,按先大后小的顺序输出(用指针实现)。main(){inta,b,*p1,*p2,*q;scanf("%
5、d,%d",&a,&b);p1=&a;p2=&b;if(*p1<*p2){q=p1;p1=p2;p2=q;}printf("a=%d,b=%d",a,b);printf("max=%d,min=%d",*p1,*p2);}运行程序,输入:11,33输出:a=11,b=33max=33,min=114.指针的运算(1)指针的加减运算当指针变量p1已指向数组a中的一个元素时,则p1+1指向该元素的下一个元素,p1-1指向该元素的前一个元素。inta[10]={1,2,3,4,5,6,7,8,9,10},i,*p1,*p2;p1=a;p2=&a[
6、9];则p1+4、p2-3、*(p1+4)、*(p2–3)、*p1、*p2分别表示什么?a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]12345678910p1p1+4p2p2-3(2)指针的赋值运算【例7.2】阅读下列程序,分析指针的变化,写出运行结果。main(){inta[10]={1,2,3,4,5,6,7,8,9,10},i,*p1,*p2;p1=a;p2=&a[9];p1++;p2--;printf("%d%d",*p1,*p2);p1=p1+3;p1++;p2--;printf("%d%d"
7、,*p1,*p2);}运行结果:2968p1指向a[0],p2指向a[9]p1指向a[1],p2指向a[8]p1指向a[4]p1指向a[5],p2指向a[7](3)两个同类型的指针相减如果指针变量p1和p2都指向同一数组,若执行p2–p1,则实际上执行的是:两个地址的差值除以数组元素的长度,即表示的是p2与p1之间相差的元素个数。如果指针变量p1和p2都指向同一数组,若p1所指向的数组元素位于p2所指向的数组元素之前,则关系表达式p18、针变量。如果一个指针变量不指向任何变量,则应给其赋值为NULL。7.3指针和一维