C语言程序设计基础第8章指针.ppt
《C语言程序设计基础第8章指针.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计基础第8章指针.ppt(52页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、C语言程序设计基础第8章 指针刘新国1第8章 指针 变量、内存单元、地址指针类型定义、初始化、赋值、使用指针应用数据传递字符串处理内存分配数据遍历8.1.2 指针类型指针是一种新的数据类型存放变量的地址存放数据单元的地址 假设定义了变量 int x,*p;那么可将变量x的地址存在指针p中:p=&x;&是取地址运算符 canf(%d,&x)变量和数据单元地址1000p内存单元201155地址10001002100420002002xyzp=&x表达式*p和变量x指代同一个东西8.1.3 指针变量的定义 类型名 *指针变量名int *p;int *p;p p 是整型指针,是整型指针,可用来可用来指
2、向整型变量指向整型变量只能指向同类型的变量只能指向同类型的变量float*fp;float*fp;fp fp 是浮点型指针,是浮点型指针,可用来可用来指向浮点型变量指向浮点型变量double*q;double*q;q q 是字符型指针,是字符型指针,可用来可用来指向指向doubledouble变量变量char*cp;char*cp;cp cp 是字符型指针,是字符型指针,可用来可用来指向字符型变量指向字符型变量8.1.4 指针的基本运算 给指针赋值int a,x,*p;p=&a;访问指针所指向的变量*p=3;*p=5;x=*p;例8-2指针运算和访问int a=3,*p;p=&a;printf
3、(a=%d,*p=%dn,a,*p);*p=10;printf(a=%d,*p=%dn,a,*p);printf(“Enter a:”);/*若输入5*/scanf(%d,&a);printf(a=%d,*p=%dn,a,*p);(*p)+;printf(a=%d,*p=%dn,a,*p);78.1.5 指针的变量的初始化 int a,x;int*p=&a;int*q=NULL;NULL是一个常量,值为0,表示空指针#define NULL 0int*q=0;float*fp=(float*)1732;8.2 变量交换swap函数实现void swap1(int x,int y)int tem
4、p=x;x=y;y=temp;void main()int a=1,b=2;swap1(a,b);能否成功交换变量a和b的值?98.2 变量交换swap函数实现void swap2(int*x,int*y)int*p=x;x=y;y=p;void main()int a=1,b=2;swap2(&a,&b);能否成功交换变量a和b的值?108.2 变量交换swap函数实现void swap3(int*x,int*y)int temp=*x;*x=*y;*y=temp;void main()int a=1,b=2;swap3(&a,&b);能否成功交换变量a和b的值?118.2.2 指针作为函数
5、的参数void swap2(int*x,int*y)int temp=*x;*x=*y;*y=temp;void main()int a=1,b=2;swap2(&a,&b);传递结果改变主调函数的变量值12例8-4编写函数,计算某年某天对应的月份和日期函数的输入参数:年份,天数int year,int yearday例如2008年的第128天,year=2008,yearday=128函数的输出结果:月份,日期结果不止一个,无法用返回值可以用指针变量int*pmonth,int*pday函数原型:void month_day(int year,int yearday,int*pmonth,i
6、nt*pday);13例8-4计算某年某天对应的月份和日期void month_day(int year,int yearday,int*pmonth,int*pday)int k,leap;int tab 213=0,31,28,31,0,31,29,31;/*闰年判别leap*/leap=(year%4=0&year%100!=0)|year%400=0;for(k=1;yearday tableapk;k+)yearday-=tableapk;*pmonth=k;*pday=yearday;148.3 指针与数组数组名实际上代表了一个指针它指向数组的首元素 int a100;那么a就是一
7、个指针,存储了a0的地址。数组名是一个指针常量不能改变它的地址值 int a100,c,*p;a=&c;/*不可以*/p=a;/*可以*/158.3 指针与数组int a100;int*p=a;指针p的地址值为3000假设整数为2个字节长指针p+1的地址值为3002指针p+i的地址值为3000+2i p+i=a+i (都指向a的第i个元素)指针的加法:指针+整数n结果:将指针往后移动n个单元即:地址值增加了n*sizeof(数据类型)a1aia99a0内存单元内存单元内存地址内存地址30023000+2i31983000指针比较与减法两指针可以比较大小其结果等价于比较它们地址的大小两同类型指针
8、可相减其结果等于它们之间所能存储的数据个数即:p地址-q地址 pq=-sizeof(类型)double a10,*p,*q;p=a;q=&a4;q-p 等于多少?4(int)q(int)p 等于多少?328.3 指针与数组int a100;指针a指向首元素a0;指针a+i指向元素ai;表达式ai等价于 *(a+i)a1aia99a0内存单元内存单元内存地址内存地址30023000+2i31983000例8-5冒泡排序把最大值放到数据的最后对剩下的数据进行重复处理-流程整体上和选择法排序一样-区别在于如何把最大值放到最后19例8-5冒泡排序void bubble(int a,int n)/*vo
9、id bubble(int*a,int n)*/int i,j,t;for(i=1;in;i+)for(j=0;jaj+1)t=aj;aj=aj+1;aj+1=t;在a0,a1,aj中aj最大交换,使得aj+1在a0,a1,aj+1中最大20例8-5冒泡排序void main()int n,a8;/*输入 n 和 n个值到数组a中*/bubble(a,n);/*输出排序后的数组a*/将数组a的首地址作为参数传给函数bubble218.3.3 数组名作为函数参数int sum(int a,int n)/*int a是形式参数int*a的等价写法)*/int i,s;for(s=0,i=0;in;
10、i+)s+=ai;return s;228.3.3 数组名作为函数参数int sum(int a,int n)/*int a等价int*a*/int i,s;for(s=0,i=0;in;i+)s+=ai;return s;假设有int b100;那么:sum(b,100)的结果是 b0+b1+b99sum(b,88)的结果是 b0+b1+b87sum(b+7,9)的结果是 b7+b8+b15sum(&b7,9)的结果也是是 b7+b8+b1523例8-7编写函数将数组逆序void reverse(int a,int n)int i,k,t;for(i=0,k=n-1;ik;i+,k-)t=a
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 基础 指针
限制150内