资源描述:
《C 程序设计教程 教学课件 作者 戴水贵 敖志刚 俞海英 编著第6章 指针.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第6章指针指针是C语言中的重要概念,也是C语言的重要特色,指针在C语言程序设计中起着重要的作用。使用指针,可以直接处理内存单元地址,有效地表示复杂的数据结构,方便地使用数组和字符串,使程序更加简洁、紧凑、高效。指针是C语言的难点,不掌握指针就没有掌握C语言的精华。6.1内存地址的概念内存地址--内存中存储单元的编号。(1)计算机硬件系统的内存储器中,拥有大量的存储单元(以字节为单位)。为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的地址。(2)在地址所标识的存储单元中存放数据。内存单元的地址与内存单元中的数据是两个完全不同的概念。见下图(图6-1):其中,1000,100
2、1,1002,…为地址(以字节为单位),00001010,10101010,01010101,…为内存单元中的数据。C语言中地址运算符“&”当用户在主程序中定义一个变量后,它在内存中就有一个存放地址(函数中的动态变量占用堆栈空间,不调用函数时,不占用空间,从函数返回后,释放堆栈空间。详见函数章节)。运算符“&”可获取变量的地址,例如:inta;//定义整型变量a(占用4字节)a=0x12345678;//将十六进制数1234赋给变量a//则&a为变量a的地址。详见下图(图6-2):01111000010101100x780x56&a&a+100110100000100100x340x1
3、2&a+2&a+3图6-2变量a的地址注意:数据的存储格式是:低位在前,高位在后(内存单元以字节为单位)。6.2指针变量的定义不同类型的变量,存放不同类型的数据。地址也是一种数据(地址是一种32位的无符号数,即unsignedlong),但地址数据的含意不同于普通的32位无符号数。因此,C语言特地定义一种指针变量,用于存放地址。6.2.1普通变量与指针变量比对(1)普通变量的定义我们已学过普通变量,普通变量的定义格式为:例如:charch;//定义字符型变量chinta;//定义整型变量afloatb;//定义实型变量b不同类型的变量,用于存放不同类型的数。<类型><变量名>;(2)指
4、针变量的定义为了与普通变量相区别,指针变量的定义格式为:例如:char*p1;//定义字符型指针变量p1int*p2;//定义整型指针变量p2float*p3;//定义实型指针变量p3不同类型的指针变量,用于存放不同类型变量的地址(或称指向不同类型的变量)。<类型>*<变量名>;6.2.2普通变量与指针变量使用比对(1)普通变量的使用例inta;//定义整型变量aa=100;//给变量a赋值或inta=100;//定义整型变量a,并赋值printf(“%x”,&a);//输出变量a的地址printf(“%d”,a);//输出变量a的值(2)指针变量的使用例int*p;//定义整型指针变
5、量pp=&a;//整型指针变量p指向整型变量a或int*p=&a;//定义整型指针变量p,并使其指向变量aprintf(“%x”,p);//输出变量a的地址printf(“%d”,*p);//输出地址处的值(3)运算符&和*使用例(参见图6-3)inta=100;intb=200;int*p1;//定义整型指针变量p1int*p2=&b;//定义整型指针变量p2,并指向变量bp1=&a;//p1指向变量a*p2=a;//将a的值(100),送到p2指向的地址单元printf(“%d”,*p2);//输出指针p2处的值(100)printf(“%x”,p2);//输出指针p2的地
6、址100200&a&bp1p2图6-3变量和变量的地址程序例1:main(){longa;//定义长整型变量a(4字节)long*p;//定义长整型指针变量pp=&a;//p指向变量a*p=0x123456AB;//将数赋给变量aprintf("%0lx",a);//输出值123456abprintf("%0lX",*p);//输出值123456ABprintf("%lX",p);//输出地址12FFF7C}程序例2:main(){floata=65536.0;//定义实型变量a,并赋值float*p=&a;//定义实型指针变量p,并指向aprintf("%X",p
7、);//12FFF7Cprintf("%f",*p);//65536.000000printf("%x",&a);//12fff7cprintf("%f",*&a);//65536.000000}程序例3://用指针变量将a和b中的数交换位置。main(){inta=10,b=20,temp;int*pa=&a,*pb=&b;printf("a=%d,b=%d",*pa,*pb);temp=*pa;*pa=*pb;*pb=tem