C语言新教材PPT课堂课件-第10章指针.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《C语言新教材PPT课堂课件-第10章指针.pdf》由会员分享,可在线阅读,更多相关《C语言新教材PPT课堂课件-第10章指针.pdf(62页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第1010章章 指指针针 C程序的变量所存放的数据: 数值型数据:整数、实数通过前面的学习,我们已知道: 字符型数据:字符、字符串 结构型数据:数组、结构体、共用体 占有一定长度的内存 单元 如:int x; x占二字节、二个单元 每一个变量都有一个地址,为无符号整数,它不同于一般的整数。问问题题: 能否对地址运算? 能否用一个变量保存地址?这这些些变变量量具具有有的的性性质质: 指针是语言中的重要概念,也是语言的重要特色。使用指针,可以使程序更加简洁、紧凑、高效。10.1 地地址址和和指指针针的的概概念念一一、数数据据在在内内存存中中的的存存放放设:系统分配i的起始地址为2000的单元内存
2、:为一个连续编号(连续地址)且以一个单元为一个字节的连续存贮区。 若程序中定义了三个int变量i, j, k int i= 5, j=5, k=10; 则: j的起始地址有可能为为2002的单元k的起始地址有可能为2004的单元2000200120022003200420053001 5+5102000ijk当程序中要用它们的值时: y=i+j+k;找到j的地址2002,将2002,20003中的数据5读出;找到k的地址2004,将2004,2005中的数据10读出。分别 找到i的地址2000,将2000,2001中的数据5读出;则系统通过一张变量名与地址对应关系表:上述过程称为变量的 “直接
3、访问”然后把这些数据进行算术运算。直接访问:直接使用存放该数据的变量名。i相当于使用 5使用变量如如:用pi, pj, pk来存放i, j, k的地址200020022004 55103001300330053007200020022004pipjpkijk 若要得到变量i的值,可以先访问pi,得到i的地址,再通过该地址找到它i的值。显然,pi与i是通过i的地址联系起来的。 间接访问:如果将某一变量的地址(如i的地址2000)存放到另一个变量x,则可通过x来存取i的值。(1)指针即地址 一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量。(2)指针变量专门用于存储其它变量地址的变量
4、指针变量pi的值就是变量i的地址。指针与指针变量的区别,就是变量值与变量的区别。(3)为表示指针变量和它指向的变量之间的关系,用指针运算符“*”表示。 在定义变量时表示是指针,在引用变量时表示取值。例如:int num, *num_pointer ; /*定义num_pointer为指向 int 型的指针变量*/num=5; /*将5直接赋给变量num*/num_pointer=# /*使num_pointer指向num */*num_pointer=3; /*将3赋给指针变量num_pointer所指向的num*/此时变量num的值=3。被间接赋值为3,即指针变量num_pointe
5、r所指向的值为3。二二、指指针针与与指指针针变变量量10.2.1 定定义义一一个个指指针针变变量量表示该变量为指向某类型变量的指针变量。如: int p; (p为指向整型变量的指针) char *s;(s为指向字符型变量的指针) float *t;(t为指向浮点型变量的指针)定义指针变量的一般形式为: 类型名 指针变量名10.2 变变量量的的指指针针和和指指向向变变量量的的指指针针变变量量例例10.1 指针变量的定义与相关运算示例。 main() int num_int=12, *p_int; /*定义一个指向int型数据的指针变量p_int */ float num_f=3.14, *p_f
6、; /*定义一个指向float型数据的指针变量p_f */ char num_ch=p, *p_ch;/*定义一个指向char型数据的指针变量p_ch */p_int=&num_int; /*取变量num_int的地址,赋值给p_int */p_f=&num_f; /*取变量num_f的地址,赋值给p_f */p_ch=&num_ch; /*取变量num_ch的地址,赋值给p_ch */printf(“num_int=%d, *p_int=%dn”, num_int, *p_int);printf(“num_f=%4.2f, *p_f=%4.2fn”, num_f, *p_f);printf(
7、“num_ch=%c, *p_ch=%cn”, num_ch, *p_ch); 程序运行结果:num_int=12, *p_int=12num_f=3.14, *p_f=3.14num_ch=p, *p_ch=p10.2.2 指指针针变变量量的的引引用用请请牢牢记记: 指针变量中只能存放地址(指针),不要讲一个整型量(或任何其他非地址类型的数据)赋给一个指针变量。下面赋值是不合法的: int *pointer_1; pointer_1=100;有两个有关的运算符:(1)&: 取地址运算符;(2) *: 指针运算符(或称“间接访问”运算符)。例如:&a为变量a的地址,*p为指针变量p所指向的存储
8、单元。 例例10.2 输入2个整数,从大到小排序输出。main() int *p1, *p2, *p,a,b; scanf(“%d%d”,&a,&b);p1=&a;p2=&b;if(ab) /*如果ab则不交换输出,否则,交换后输出。p1p2abp1p2ab对于“&”和“*”运算符做一些说明:(1) 如果有pointer_1=&a,那么&*pointer_1是什么? 由于*pointer_1是变量a的值,那么&*pointer_1就是变量a的地址。(2) 如果有*&a,那么*&a是什么含义? 先进行&a运算,得到a的地址,在进行*运算。即&a所指向的变量,等价于变量a。注意:存取指针变量所指向
9、变量(目标变量)的值:用指针运算符*, 即:*p 为 i。 , &为同级运算符,结合性自右至左。则当&或&在一起时,具有抵消作用。(3) (*pointer_1)+相当于a+。注意前面要有括号。 10.2.3 指指针针变变量量作作函函数数参参数数1.指针变量,既可以作为函数的形参,也可以作函数的实参。2.指针变量作实参时,与普通变量一样,也是“值传递”,即将指针变量的值(一个地址)传递给被调用函数的形参(必须是一个指针变量)。注注意意:被调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。例例10.3 使用函数调用方式,输入2个整数,从大到小排序输出,要求实参为指针变量。
10、void swap(int *p1, int *p2) int temp;temp=*p1, *p1=*p2, *p2=temp; main() int a,b; int *pointer_1=&a, *pointer_2=&b; scanf(“%d %d”, &a,&b); if(ab) swap(pointer_1 ,pointer_12); /*指针变量作实参*/ printf(“n%d, %dn”, a,b); /*输出排序后的a和b的值*/ 程序运行情况:5 9 9 5 虽然被调用函数不能改变实参指针变量的值,但可以通过它来改变它们所指向的变量的值。 为了利用被调用函数改变的变量值,
11、应该使用指针变量作函数实参。其机制为:在执行被调用函数时,使形参指针变量所指向的变量的值发生变化;函数调用结束后,通过不变的实参指针将变化的值保留下来。 例例10.4 输入3个整数,按降序(从大到小的顺序)输出。要求使用变量的指针作函数调用的实参来实现。swap(int *p1, int *p2) int temp; temp=*p1, *p1=*p2, *p2=temp; exchange(int *q1, int *q2,int *q3) if(*q1*q2)swap(q1,q2);if(*q1*q3)swap(q1,q3);if(*q2*q3)swap(q2,q3);main() int
12、 a,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, %dn”,a,b,c); 程序运行情况:9 0 10 10,9,0 一个变量的地址为该变量的指针。当用一个变量来存放该地址(指针)时,称为指针变量。 一个数组元素相当于一个简单变量。于是,亦可用一个指针变量来指向数组元素。不同之处: 数组元素连续地占用内存单元,则当一个元素的指针已知时,其它元素的指针亦可知道。10.3 数数组组与与指指针针 概概述述1.概念数组的地址数组
13、在内存中的起始地址,数组元素的地址数组元素在内存中的起始地址。指向数组元素的指针即指针变量的值为数组元素的地址。2.指向数组元素的指针变量的定义指向数组元素的指针变量的定义,与指向普通变量的指针变量的定义方法一样。例如,int array10, *pointer=array;指向数组元素的起始地址指向数组元素的第0号元素。或者: int array10, *pointer&array0;注注意意:数组名代表数组在内存中的起始地址(与第0个元素的地址相同),所以可以用数组名给指针变量赋值。3.数组元素的引用数组元素的引用,既可用下标法,也可用指针法。使用下标法,直观;而使用指针法,能使目标程序占
14、用内存少、运行速度快。定义方法与简单变量指针定义相同,但引用略有不同例: int a10; int p; /*定义*/ p=&a0; /*将a的第0个元素的地址赋给p*/ C语言规定: 数组a的首地址即用&a0表示,亦可用a表示 所以:p=&a0; 和 p=a等价10.3.1 指指向向数数组组元元素素的的指指针针 上面也可以这样定义: int a10, *p=&a0; 或 int a10, *p=a;10.3.2 通通过过指指针针引引用用数数组组元元素素 C语言的规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素(而不是将p值简单加1)。 如果p的初值为&a0,则:
15、 (1) p+i和a+i就是ai的地址,或者说,它们指向a数组的第i个元素。 (2) *(p+i)或*(a+1)是p+i或a+i所指向的数组元素,即ai。如:*(p+5)或*(a+5)就是a5。 (3) 指向数组的指针变量也可以带下标,如pi与*(p+i)等价。例例 10.5 用上面提到的四种表达方式输出同一个数组。 #include main()int a5 = 1, 2, 3, 4, 5; int i;int *pa; for(i=0; i5; i+) printf(“a%d=%d”, i, ai); /*数组下标法*/ putchar(n);pa=a; for(i=0; i5; i+)
16、printf(pa%d=%d , i, pai); /*指针下标法*/ putchar(n); for(i=0; i5; i+) printf(*(a+%d)=%d , i, *(a+i); /*指针法1*/ putchar(n); for(pa=a;paa+5;pa+) printf(*(pa+%d)=%d ,i,*pa); /*指针法2*/ putchar(n);运行结果:a0=1 a1=2 a2=3 a3=4 a4=5pa0=1 pa1=2 pa2=3 pa3=4 pa4=5*(a+0)=1 *(a+1)=2 *(a+2)=3 *(a+3)=4 *(a+4)=5*(pa+0)=1 *(p
17、a+1)=2 *(pa+2)=3 *(pa+3)=4 *(pa+4)=5说说明明: (1)以上四种输出方法等价。 (2)以上四种方法修改的是同一内存单元内的内容。 在在使使用用指指针针变变量量时时,有有几几个个问问题题要要注注意意: (1)指针变量的值是可以改变的,所以必须注意其当前值,否则容易出错。如:p+是合法的,那么能不能a+呢? (2)指向数组的指针变量,可以指向数组以后的内存单元,虽然没有实际意义。 (3)对指向数组的指针变量(px和py)进行算术运算和关系运算的含义 1)可以进行的算术运算,只有以下几种: pxn, px+/+px, px-/-px, px-py pxn:将指针从当
18、前位置向前(+n)或回退(-n)n个数据单位,而不是n个字节。显然,px+/+px和px-/-px是pxn的特例(n=1)。 px-py:两指针之间的数据个数,而不是指针的地址之差。 2)关系运算 表示两个指针所指地址之间、位置的前后关系:前者为小,后者为大。例如,如果指针px所指地址在指针py所指地址之前,则pxpy的值为1。10.3.3 数数组组名名作作函函数数参参数数数组名作形参时,接收实参数组的起始地址;作实参时,将数组的起始地址传递给形参数组。引入指向数组的指针变量后,数组及指向数组的指针变量作函数参数时,可有种等价形式(本质上是一种,即指针数据作函数参数):(1)形参、实参都用数组
19、名。 例例10.6 :void inv (int x ,int n) int temp,i,j,m=(n-1)/2;for(i=0;i=m;i+) j=n-1-i;temp=xi; xi=xj; xj=temp;main () int i,a10=3,7,9,11,0,6,7,5,4,2;printf(“nthe original array is:n”);for(i=0;i10;i+) printf(“%d ”,ai);inv(a,10);printf(“nthe array has been inverted:n”);for(i=0;i10;i+) printf(“%d ”,ai);(2)
20、形参、实参都用指针变量例例10.7 void inv(int *x,int n)int *p=x+m,temp,*i=x,*j=x+n-1,m=(n-1)/2;for(; i=p; i+,j-) temp= *i; *i= *j; *j=temp ;main()main() intint i,a10=3,7,9,11,0,6,7,5,4,2,*p=a; i,a10=3,7,9,11,0,6,7,5,4,2,*p=a;printf(ntheprintf(nthe original array is:n); original array is:n);for(i=0;i10;i+) for(i=0;
21、i10;i+) printf(%dprintf(%d ,ai); ,ai);inv(inv(p p,10);,10);printf(ntheprintf(nthe array has been inverted:n); array has been inverted:n);for(i=0;i10;i+) for(i=0;i10;i+) printf(%dprintf(%d ,ai); ,ai); (3)形参用指针变量、实参用数组名 例例10.8 void inv(int *x,int n)int *p=x+m,temp,*i=x,*j=x+n-1,m=(n-1)/2;for(; i=p; i+
22、,j-) temp= *i; *i= *j; *j=temp ;main () int i,a10=3,7,9,11,0,6,7,5,4,2;printf(“nthe original array is:n”);for(i=0;i10;i+) printf(“%d ”,ai);inv(a,10);printf(“nthe array has been inverted:n”);for(i=0;i10;i+) printf(“%d ”,ai);(4)形参用数组名、实参用指针变量 例例10.9 void void inv(intinv(int x x , ,intint n) n) intint
23、temp,i,j,m=(n-1)/2; temp,i,j,m=(n-1)/2;for(i=0; i=m; i+)for(i=0; i=m; i+) j=n-1-i;temp= xi; xi= xj; xj=temp; j=n-1-i;temp= xi; xi= xj; xj=temp; main()intmain()int i,a10=3,7,9,11,0,6,7,5,4,2,*p=a; i,a10=3,7,9,11,0,6,7,5,4,2,*p=a;printf(ntheprintf(nthe original array is:n); original array is:n);for(i=
24、0;i10;i+) for(i=0;i10;i+) printf(%dprintf(%d ,ai); ,ai);inv(inv(p p,10);,10);printf(ntheprintf(nthe array has been inverted:n); array has been inverted:n);for(i=0;i10;i+) for(i=0;i10;i+) printf(%dprintf(%d ,ai); ,ai); 10.3.4 二二维维数数组组的的指指针针及及其其指指针针变变量量 1. 二维数组的指针 假设有如下数组定义语句: int array34; (1)从2维数组角度看
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 新教材 PPT 课堂 课件 10 指针
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内