指针是C语言的重要概念_第1页
指针是C语言的重要概念_第2页
指针是C语言的重要概念_第3页
指针是C语言的重要概念_第4页
指针是C语言的重要概念_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十章 指针 指针是C语言的重要概念,是C语言的特色,是C语言的精华. 10.1 地址和指针的概念 内存中的每一个字节都有一个地址. 内存单元的地址与内存单元的内容是两个完全差别的概念. 在编译时给出了变量名和地址的对应关系. 往常在程序中定义整形等变量.似 int a,b; 示意a和b申请整形单元,分不存放两个整形值. 我们也能够定义一种特别的变量,它用来存放内存单元地址.这种变量的值是一个地址,它的作用是:依照地址去寻相应的单元,所以,这种装载地址的变量又可称为“指针变量”. 指针变量的值便是指针即地址. 10.2 变量的指针和指向变量的指针变量 变量的指针便是变量的地址.存放地址的变量称

2、谓指针变量. 为了示意指针变量和它所指向的变量之间联系,程序中用*符号示意“指向” 似用i_point示意指针变量,而*i_point便示意i_point指向的变量. 10.2.1 定义一个指针变量 C语言规定全部变量在使用前必须定义,指定其类型,同时按此安排内存单元. int i,j; int *point1,*point2; 定义了两个指向整形变量的指针变量. 定义指针变量要指定“基类型” 基类型是指针变量指向的变量的类型. 指针变量的定义形式: 基类型 *指针变量名 那么似何给指针变量赋值呢? point1=&i; point1=&j; 10.2.2 指针变量的引用 指针

3、变量只能存放地址(指针),有两个有关的运算符: (1)&:取址运算符,&a (2)*:指针运算符(“间接运算符”),*p main() int a,b;int *point1,*point2; a=100;b=20; point1=&a; point2=&b; printf(“%d,%dn”,a,b); printf(“%d,%dn”, *point1,*point2); point1=&*point2; ? b=*&a; ? main() int *p1,*p2,*p,a,b; a=10;b=90; p1= &a;p2=&b;

4、if(ab)p=p1;p1=p2;p2=p; printf(“%d,%dn”,*p1,*p2); 10.2.3 指针变量做为函数指标 函数指标能够是指针变量 swap(int *p1,int *p2) int temp; temp=*p1;*p1=*p2;*p2=temp; main() int a,b, *point1,*point2; a=10;b=90; point1=&a; point2=&b; if(ab)swap(point1,point2); printf(“%d,%dn”, *point1,*point2);10.3 数组的指针和指向数组的指针变量 一个变量有地

5、址,一个数组包罗如果干个元素,每个元素都有地址. 数组的指针是指数组的起始元素的地址. 引用数组元素可用下标法,也可用指针法,即用指针指向所引用的元素. 10.3.1 指向数组元素的指针 int a10; int *p; p=&a8; C语言规定数组名代表数组的首地址,也便是第0号元素的地址. 下面两个句子等价: p=&a0; p=a; 10.3.2 通过指针引用数组元素 按C语言规定:似果指针变量p已指向数组中的一个元素,那么p+1指向同一数组中的下一个元素(而不是将的p的值简单加1). 似果p的初值为&a0,那么 (1)p+i和a+i便是ai的地址 (2)*(p+i

6、)和*(a+i)是p+i和a+i所指向的数组元素,即ai. 能够发现, 现实上是变址运算符 (3)指向数组的指针变量也能够带下标,似 pi与*(p+i)等价. 10.3.3 用数组名作函数指标 例: main() inv(int arr ,int n) int array10; : : inv(array,10); : 用数组名作指标时,似果形指标组中各元素值产生改变,实指标组值随之改变. void inv(int arr ,int n) int t,i,j,m=(n-1)2; for(i=0;i=m;i+) j=n-1-i;t=arri;arri=arrj;arrj=t; main() in

7、t i,a10=2,4,54,6,7,3,31,56,23,65; inv(a,10); for(i=0;i=9;i+) printf(“%d”,ai); f(int arr ,int n)等价于f(int *arr,int n) 例: 函数定义为: 函数调用为: void swap(int x,int y) swap(a1,a2); 请大伙儿注重: (1)“值传递”和“地址传递” (2)两者之间的异同点int m1,m2;void m_value(int array ,int n) int *p,*array_end; array_end=array+n; m1=m2=*array; for

8、(p=array+1;pm1)m1=*p; else if(*pm2)m2=*p;main() int i,num10;for(i=0;i10;i+)scanf(“%d”,&numi);m_value(num,10);printf(“%d,%d”,m1,m2); 函数指标为数组时: (1)形参和实参根基上数组名,似: main() f(int arr ,int n) int a10; : : f(a,10); : (2)实参是数组名,形参是指针变量,似: main() f(int *arr,int n) int a10; : : f(a,10); : (3)形参和实参根基上指针变量,似

9、: main() f(int *arr,int n) int a10,*p=a; : : f(p,10); : (4)实参是指针变量,形参是数组名,似: main() f(int arr ,int n) int a10,*p=a; : : f(p,10); : 挑选法排序 sort(int x ,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jxk)k=j; if(k!=i)t=xi;xi=xk;xk=t; 10.3.4 指向多维数组的指针和指针变量 1、多维数组的地址 考查:int a34; a是一个数组名. a数组见谅3行,即算作3

10、个元素: a0、a1、a2.而一个元素又是一个一维数组,见谅4个元素. a0所代表的一维数组见谅的4个元素是: a00、a01、a02、a03 从二维数组来看, a代表整个二维数组的首地址, 也便是第0行的首地址,即a0地址 a+1代表第1行的首地址,即a1地址 a+2代表第2行的首地址,即a2地址 现实上a0、 a1和 a2分不示意的是二维的第0行、第1行和第2行. 基于这种认识,把a0、 a1和 a2算作是一维数组名,C语言又规定数组名代表数组的首地址,所以a0代表第0行一维数组中第0列元素的地址,即&a00 依此类推a1的值是 &a10 依此类推a2的值是 &a2

11、0 第0行第1列元素的地址可示意为: a0+1 在一维数组中, a0和*(a+0)等价, a1和*(a+1)等价,等 懂得: a是二维数组的首地址 a1即*(a+1)是第二行的首地址 用地址法似何猎取a01呢? 它的地址示意为 a0+1,值示意为*(a0+1) 进一步示意为:*(*(a+0)+1) 讲明:对二维数组来讲, ai示意的是一维数组名, ai自已不占现实的内存单元,它只是一个地址,示意地址的一种统计方式,似同一维数组x10的数组名. 2、指向多维数组的指针变量 (1)指向数组元素的指针变量 main() int a34=1,3,5,7,9,11,13,15,17,19,21,23;

12、int *p; for(p=a0;py?x:y; return(z); 将main函数改写为: main() int max(int,int); int (*p)(); int a,b,c; p=max; 将max的入口地址赋给p scanf(“%d,%d”,&a,&b); c=(*p)(a,b); printf(“Max is %d”,c); int (*p)()定义p是一个指向函数的指针变量,此函数带回整型的返回值. 定义指向函数的指针变量的一样形式 信息类型 (*指针变量)( ); 其它注重事项见教材 10.5.2 用指向函数的指针作函数指标 函数的指标能够是变量,指向变

13、量的指针变量,数组名,指向数组的指针变量,等等 函数指针变量常用的用途之一是把指针做为指标传递到其他函数,是C语言中深入的部分. sub(int (*x1)(int),int (*x2)(int,int) int a,b,i=1,j=2; a=(*x1)(i); b=(*x2)(i,j); .10.6 返回指针值的函数 一个函数能够带回一个整型值,字符值,实型值等,也可带回指针型的信息,即地址. 其本质与往常类似,只是带回的值是指针类型而已 带回指针值的函数,可定义为: 基类型 *函数名(指标表); 似: int *a(int x,int y); main() float score4=60,

14、70,80,90,50,89,67,88, 34,78,90,66,*p; float *search(float (*ptr)4); int i,j; for(i=0;i3;i+) p=search(score+i); if(p=*(score+i) printf(“No. %d scores:”,i); for(j=0;j4;j+)printf(“%5.2f”,*(p+j); printf(“n”); float *search(float (*ptr)4) int i; float *pt; pt=*(ptr+1); for(i=0;i4;i+) if(*(*ptr+i)60) pt=*

15、ptr; break; return(pt); 10.7 指针数组和指向指针的指针 10.7.1 指针数组的概念 一个数组其元素均为指针类型信息,称为指针数组.指针数组中的每一个元素都相当于指针变量.一维指针数组的定义为: 类型名 *数组名数组长度 关键用于指向如果干个字符串,使字符串的操作更加灵活,似: char *name =“Tom”,”Bill”,”David”; 10.7.2 指向指针的指针 指针数组的数组名便是一个指针的指针. char *p; 相当于 char *(*p); 指针p是指向一个字符指针变量的变量. *p便是p指向的另一个指针变量 变量的直截了当会见,间接会见(单级间

16、址,二级间址,多级间址). 10.7.3 指针数组作main函数的形参 指针数组的一个重要作用便是作main函数的形参. main函数的一样形式为: main( ) 现实上main函数能够有形参,似 main(argc,argv) main函数是系统调用的,它的形参对应的实参从何而来呢? 从OS号令中猎取: 号令名 指标1 指标2指标n 操纵指针数组作main函数的形参,能够向程序传送号令行指标(这些指标是字符串).因为指标的长度和个数根基上不定的,所以用指针数组恰好能满足这一要求.10.8 有关指针的信息类型和指针运算的小结 10.8.1 有关指针的信息类型的小结 int i; int *p; int an; int *pn; int (*p)n; int f( ) int *p( ) int (*p)( ) int *p; 10.8.2 指针运算小结 (1)指针变量加(减)一个整数 似:p+,p-i等 (2)指针变量赋值 p=&a; p=array; p=&arrayi; p=max; p1=p2; (3)指针变量赋空值,示意不指向任何变量 p=NULL; (4)两个指针变量

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论