第8章 指针-xg-zhan.ppt_第1页
第8章 指针-xg-zhan.ppt_第2页
第8章 指针-xg-zhan.ppt_第3页
第8章 指针-xg-zhan.ppt_第4页
第8章 指针-xg-zhan.ppt_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

1、北京邮电大学出版社,第8章 指针,8.1 地址与指针 8.2 指针变量 8.3 指针与数组 8.4 指针与字符串 8.5 指针与函数 8.6 指针数组 8.7 多级指针 本章小结 习题参考答案,北京邮电大学出版社,8.1 地址与指针,地址:一般把存储器中的一个字节称为一个内存单元。计算机为每个内存单元进行编号,内存单元的编号也就是内存单元的地址. 指针:通常也把这个地址称为指针。所以说指针本质上就是地址。 注:内存单元的地址(即指针)和内存单元的内容是两个不同的概念。 指针变量:在语言中,允许用一个变量来存放指针,这种变量称为指针变量。,北京邮电大学出版社,指针和指针变量:一个指针是一个地址,

2、是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。 但常把指针变量简称为指针。 引进指针的目的,就是为了能直接访问内存单元。 获取数据单元或代码的指针: 例如变量a,使用取地址运算符 /* 不允许保存整型数据*/ pointer1= /* 3.14是常数,不能使用 其中,*表示这是一个指针变量。 类型说明符表示本指针变量所指向的变量的数据类型。 而指针变量自身的类型就是指针型。 例如: int *p2; /*p2是指向整型变量的指针变量*/ float *p3; /*p3是指向浮点变量的指针变量*/ char *p4; /*p4是指向字符变量的指针变量*/,北京邮电大学出版社,8.2

3、.2指针变量的引用 两种与指针有关的运算符: /* *p表示取指针变量p所指向单元的内容,即变量x的值,因此y=10 */ 注意:在第一个语句中“*p”表示将p定义为一个指针变量,用以区别一般的变量,而第三个语句中的“*p”是使用指针变量,此时“*”是指针运算符,表示取出指针变量p所指向单元的内容。如图8.3:,北京邮电大学出版社,8.2.3 指针变量的使用 指针变量的初始化方式有两种: 1指针变量初始化的方法 int a; int *p=,北京邮电大学出版社,x=*ip; *ip访问的是地址为1800的存储单元 等价于 x=i; 另外,指针变量值是可以改变的,即可以改变它们的指向,假设 ch

4、ar i,j,*p1,*p2; i=a; j=b; p1=,北京邮电大学出版社,北京邮电大学出版社,这时赋值表达式语句: p2=p1; 就是使p2与p1指向同一对象i,此时的*p2就等价于i,而不是j,如图8.6所示:,北京邮电大学出版社,如果执行如下赋值表达式语句: *p2=*p1; 实际上就是j=i; 则表示把p1指向的内容赋给p2所指的区域,,此时就变成图8.7所示,北京邮电大学出版社,通过指针访问它所指向的一个变量是以间接访问的形式进行的,所以比直接访问一个变量要费时间,而且不直观。 例如*p2=*p1;实际上就是j=i;,前者不仅速度慢而且目的不明。但灵活性,使代码简洁和有效。 指针

5、变量可出现在表达式中。设 int x,y;*px= px+ */ ),北京邮电大学出版社,例8.1写出下列程序的运行结果 main() int a ,b ,p; int *p1, *p2; a=10; b=20; p1= 运行结果: 20,10 20,10,北京邮电大学出版社,例8.2写出下列程序的运行结果。 main() int a,b; int *p1, *p2,*p; a=10; b=20; p1= 运行结果: 10,20 20,10 请读者自己思考本题与例题8.1的区别在哪儿?为什么结果不一样?,北京邮电大学出版社,8.3 指针与数组,8.3.1通过指针访问一维数组 在C语言中,指针和

6、数组有着非常紧密的联系,其原因在于凡是由数组下标完成的操作皆可用指针来实现。在数组中我们知道,可以通过数组的下标唯一确定数组中的某个元素,这种访问方式称为“下标法”。 例如: int a5=1,2,3,4,5 ,x , y; x=a0 ; /* 通过下标将数组a中下标为0的元素赋给x,x=1 */ y=a3 ; /*通过下标将数组a中下标为3的元素赋给y,y=4 */ 由于数组中的每个元素都相当于相应类型的变量,指针变量可以指向一般的变量,因此指针变量也可以指向数组中的元素,也可以用“指针法”来访问数组中的元素。我们以前知道数组中的各个元素都是按顺序连续的存在内存中,因此,我们只要知道一个数组

7、的首地址即第一个元素的地址,然后依次往下移动,就能找到该数组的所有元素。,北京邮电大学出版社,例 8.3 main() int a= 1,2,3,4,5,6; int x,y,*p; p=”表示将数组a的首地址即a0的地址赋给指针变量p,即p就指向了该数组的首地址。,北京邮电大学出版社,在C语言中,获取数组的首地址有两种方法: 1数组中第一个元素的地址,如:”等价于“p=a”。 如例8.3对于指针变量p指向了数组的首地址,p+1就代表数组中元素a1的地址,p+2也代表元素a2的地址,依次类推,p+i 就代表ai的地址,同样 a+i也代表ai的地址;因此对于数组的元素ai的值,同样可以用*(p+

8、i)或*(a+i)表示,这种访问数组元素的方法也称为指针法。如图8.9所示:,北京邮电大学出版社,对于数组元素的访问,下标法和指针法是等价的。设a是一个数组名,指针变量p指向了数组a的首地址,对于数组a元素的表示方法有4种: 1下标法:ai 或 pi 2指针法:*(a+i) 或 *(p+i) 但是读者要注意,数组名和指针变量p本身并不完全等同;数组名代表一个地址常量,是数组的首地址,不能被用户改变它的值,不同于指针变量,指针变量的值是可以被改变的。因此语句:p+、+p、p=p+1都是正确的;而语句:a+、+a、a=a+1都是错误的。 例8.4 输出数组a中的全部元素。 main() int a

9、10,i; for(i=0;i10;i+) *(a+i)=i; for(i=0;i10;i+) printf(a%d=%dn,i,*(a+i); ,北京邮电大学出版社,例8.5分析以下程序。 main() int a=1,2,3,4,5,*p; p=a; printf(%dn,*p); printf(%dn,*(+p); printf(%dn,*(p-); p+=3; printf(%dn%dn,*p,*(a+3); ,运行结果: 1 2 2 4 4,北京邮电大学出版社,例 8.6 通过移动指针来访问数组中的所有元素。 main() int *p,i,a8; p=a; for(i=0;i8;i

10、+,p+) *p=i; p=a; for(i=0;i8;i+,p+) printf(a%d=%dn,i,*p); ,北京邮电大学出版社,8.3.2通过指针访问二维数组 在C语言中,二维数组是按行优先的规律转换一维数组存放在内存中,因此,可以通过指针访问二维数组中的元素。若有: int a43 ,*p; p= 则二维数组a的数据元素在内存中存储顺序及地址关系如图8.10所示:,北京邮电大学出版社,这里,a表示二维数组的首地址;a0表示0行的元素的起始地址,a1表示1行的元素的起始地址,a2表示2行的元素的起始地址,a3表示3行的元素的起始地址。因此a和a0是数组a00的地址,也是0行的地址。a+

11、1和a1是数组元素a10的地址,也是1行的首地址。 由于a是二维数组,经过两次下标运算 之后才能访问到数组元素。所以根据C语言的地址计算方法,a要经过两次*操作才能访问到数组元素。这样就有,*a或a0就是数组元素 a00的地址,*a就是元素a00,同样*a0也表示数组元素a00。 1二维数组的指针 假设有如下数组定义语句: int array34; (1)从二维数组角度看,数组名array代表数组的起始地址。 array+i:行指针值,指向二维数组的第i行。 *(array+i):(列)指针值,指向第i行第0列(控制由行转为列,但仍为指针)。 *(*(array+i):数组元素arrayi0的

12、值。 用array作指针访问数组元素arrayij的格式: *(*(array+i)j),北京邮电大学出版社,(2)从一维数组角度看,数组名array和第1维下标的每一个值,共同构成一组新的一维数组名array0、array1、array2,它们均由4个元素组成。 C语言规定:数组名代表数组的起始地址,所以arrayi是第i行一维数组的地址,它指向该行的第0列元素,是一个以数组元素为单位进行控制的列指针: arrayi+j:(列)指针值,指向数组元素arrayij。 *(arrayi+j):数组元素arrayij的值。 如果有“int array34,*p=array0;”,则p+1指向下一个

13、元素,如图8.12所示。,北京邮电大学出版社,用p作指针访问数组元素arrayij的格式: *(p+(*每行列数+j) 2行指针变量(数组指针)指向由n个元素组成的一维数组的指针变量 (1)定义格式 数据类型 (*指针变量)n; 注意:“*指针变量”外的括号不能缺,否则成了指针数组数组的每个元素都是一个指针变量。 (2)赋值 行指针变量 二维数组名 (或行指针变量);,北京邮电大学出版社,例8.7 使用行指针输出二维数组的任一元素。 main() int array34=1,2,3,4,5,6,7,8,9,10,11,12; int (*p)4, row, col; p=array; prin

14、tf(Input row=); scanf(%d, ,北京邮电大学出版社,例 8.8 使用列指针输出二维数组的任一元素。 main() int array34=1,2,3,4,5,6,7,8,9,10,11,12; int *p, row, col; /*定义一个(列)指针变量p*/ p=array0; /*给(列)指针变量p赋值*/ printf(Input row=); scanf(%d, 程序运行结果: Input row=1 Input col=1 array11=6,北京邮电大学出版社,8.3.3指针的基本运算 对于指针的运算有三种:指针与正整数的加减运算、两个指针的关系运算以及两个

15、指针的减法运算。 指针与正整数的加减运算 当指针p指向数组中的元素时,n为一个正整数,则表达式: p+n 表示:指针p所指向当前元素之后的第n个元素。而表达式 p-n 表示:指针p所指向当前元素之前的第n个元素。 最常见的指针加减运算为p+的含义是:指针加1,指向数组中的下一个元素;p-的含义是:指针减1,指向数组中的前一个元素。 由于指针p所指的具体对象不同,所以对指针与整数进行加减运算时,C语言会根据所指的不同对象计算出不同的放大因子,以保证正确操作实际的运算对象。对于字符型,放大因子为1;对于整型,放大因子为2;对于长整型,放大因子为4;对于双精度类型,放大因子为8。也就是说不同数据类型

16、的放大因子等于该数据类型在内存所占的字节数。,北京邮电大学出版社,例 8.9 用指针进行字符串的复制,把字符串str1复制到字符串str2。 # include main() char str180,str280,*p1,*p2; printf(Enter string 1:); gets(str1); p1=str1; p2=str2; while(*p2=*p1)!=0) p1+; p2+; printf(String 2:); puts(str2); ,北京邮电大学出版社,2两个指针的关系运算 只有当两个指针指向同一个数组的元素时,才能进行关系运算。 当指针p和指针q指向同一数组时,则:

17、 当p所指的元素在q所指的元素之前时,pq; 当p和q指向同一元素时,p=q。 不允许两个指向不同数组的指针进行比较,因为这样的判断没有任何实际的意义。,北京邮电大学出版社,例 8.10 编写程序将一个字符串反序 # include main() char str50,*p,*s,c; printf(Enter string:); gets(str); p=s=str; while(*p) p+; p-; while(sp) c=*s; *s+=*p; *p-=c; puts(str); ,北京邮电大学出版社,两个指针的减法运算 两个指针变量之间的运算:只有指向同一数组的两个指针变量之间才能进

18、行减法运算,否则运算毫无意义。 两指针变量相减:两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。例如pf1和pf2是指向同一单精度型数组的两个指针变量,设pf1的值为2010H,pf2的值为2000H,而浮点数组每个元素占4个字节,所以pf1-pf2的结果为(2000H-2010H)/4=4,表示pf1和 pf2之间相差4个元素。两个指针变量不能进行加法运算。例如,pf1+pf2是什么意思呢?毫无实际意义。,北京邮电大学出版社,例 8.11 用指针相减求字符串的长度 # include main() char

19、str50,*p=str; printf(Enter string:); gets(str); while(*p) p+; printf(String Length=%dn,p-str); ,北京邮电大学出版社,8.4 指针与字符串,8.4.1 字符数组与字符指针 我们在前面详细讨论过字符数组与字符串,字符指针也可以指向一个字符串。可以用字符串常量对字符指针进行初始化。例如,有说明语句: char *str1=”How are you!”; 此时字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址。 这里要注意字符指针与字符数组的区别,例如,有说明语句: char str2 =”How

20、 are you!”; 此时,str2是字符数组,它存放一个字符串。 字符指针str1与字符数组str2的区别是:str1是一个变量,可以改变str1的值,即str1可以指向不同内存单元;str2是一个数组名,数组名str2的值不能改变,也就是说str2的值也是一个内存单元的地址,但是地址不能被用户改变。,北京邮电大学出版社,例如: char *str ,*str1=”Hello!”; char string100=”China”; 则下面语句是正确的: str+; str=”Computer”; str=str1; strcpy(string,”ABCEFGH”); strcat(strin

21、g,str); 而下面语句是错误的: string+; /* 不能对数组名进行+运算 */ string=”How do you do!”; /* 不能给数组名进行赋值操作 */ string=str; /* 不能给数组名进行赋值操作 */,北京邮电大学出版社,8.4.2 字符指针举例 在C语言中,如我们上节所讨论的,有两种方法访问一个字符串: 1用字符数组存放一个字符串,然后输出该字符串。 例812写出下列程序的运行结果 main() char string=”I love China!”; printf(%sn,string); 运行结果: I love China! 说明:和前面介绍的数

22、组属性一样,string是数组名,它代表字符数组的首地址。 2用字符指针指向一个字符串。 可以不定义字符数组,而定义一个字符指针变量,用字符指针变量指向字符串中的字符。,北京邮电大学出版社,2用字符指针指向一个字符串。 可以不定义字符数组,而定义一个字符指针变量,用字符指针变量指向字符串中的字符。 例8.13写出下列程序的运行结果 main() char *string=”I love China!”; printf(%sn,string); 运行结果: I love China!,例8.14在输入的字符串中查找有无k字符。 main() char st20,*ps; int i; print

23、f(input a string:n); ps=st; scanf(%s,ps); for(i=0;psi!=0;i+) if(psi=k) printf(there is a k in the stringn); break; if(psi=0) printf(There is no k in the stringn); ,北京邮电大学出版社,例8.15将s所指字符串下标为偶数的字符删掉,s中剩余的字符形成的新串放在t所指的数组中。例如:当s所指字符串为ABCDEFGHIJK,在t中所指数组中的内容为:BDGFHJ,#include #include void fun(char *s,cha

24、r t) int i,j,n; n=strlen(s); for(i=0,j=0;in;i+) if(i%2!=0) tj=si;j+; tj= 0; main() char s80,t80; printf(nplease enter string:); scanf(%s,s); fun(s,t); printf(nthere is :%sn,t); ,北京邮电大学出版社,8.5 指针与函数,我们知道在函数之间可以传递一般变量的值,在函数之间同样可以传递地址(指针)。函数与指针之间有着密切的关系,它包含三种关系:指针作为函数的参数,函数的返回值为指针及指向函数的指针。 8.5.1指针作函数的参

25、数 变量的地址属性是变量的一个重要特性,知道了变量的地址就可以通过地址间接访问变量的数值,变量的地址在C语言中就是指针,通过地址间接访问变量的数值就是通过指针间接访问指针所指的内容。指针作函数的参数就是在函数间传递变量的地址。 在函数间传递变量地址时,函数间传递的不再是变量中的数据,而是变量的地址。此时,变量的地址在调用函数时作为实参,被调用函数使用指针变量作为形参接收传递的地址。这里实参的数据类型要与形参的指针所指的对象的数据类型一致。,北京邮电大学出版社,例816 输入的两个整数按大小顺序输出。 swap(int *p1,int *p2) int temp; temp=*p1; *p1=*

26、p2; *p2=temp; main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d, 运行结果: 5,7 7,5,北京邮电大学出版社,例8.17 请注意,不能企图通过改变指针形参的值而使指针实参的值改变。 swap(int *p1,int *p2) int *p; p=p1; p1=p2; p2=p; main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d, 运行结果: 5,9 5,9,北京邮电大学出版社,例8.18 输入a、b、c三个整数,按大小顺序输出。 swap(int *pt1,

27、int *pt2) int temp; temp=*pt1; *pt1=*pt2; *pt2=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 a,b,c,*p1,*p2,*p3; scanf(%d,%d,%d, ,程序运行结果: 1,2,3 3,2,1,北京邮电大学出版社,8.5 指针与函数,8.5.2数组名作函数的参数 数组名可以作函数的实参和形参。本质上也是地址传递。 例如: main() int a

28、rray10; f(array,10); f(int arr,int n); ,北京邮电大学出版社,其中array为实参数组名,arr为形参数组名。在学习指针变量之后就更容易理解这个问题了。数组名就是数组的首地址,实参向形参传送数组名实际上就是传送数组的首地址,形参得到该地址后也指向同一数组。这就好象同一件物品有两个彼此不同的名称一样。如图8.19所示。,北京邮电大学出版社,同样,指针变量的值也是地址,数组名即为数组的首地址,当然也可作为函数的参数使用。 例819 输入10个学生的成绩,求学生的平均成绩。 float aver(float *pa); main() float score10,

29、av,*sp; int i; sp=score; printf(ninput 10 scores:n); for(i=0;i10;i+) scanf(%f, ,北京邮电大学出版社,例8.20 利用函数从10个数中找出其中最大值和最小值。 本题要求不能改变数组元素的值,求出其中的最大值和最小值,而函数调用只能得到一个返回值,因此本题利用用全局变量在函数之间“传递”数据。程序如下: int max,min; /*全局变量*/ void max_min_value(int array,int n) int *p,*array_end; array_end=array+n; max=min=*arra

30、y; for(p=array+1;pmax) max=*p; else if(*pmin) min=*p; ,main() int i,number10; printf(Enter 10 numbers:n); for(i=0;i10;i+) scanf(%d, 程序运行结果: Enter 10 integer numbers: 5 4 10 9 16 8 20 12 7 11 max=20,min=4,北京邮电大学出版社,例821 将数组a中的n个整数按相反顺序存放。 求解此题的算法为:将a0与an-1对换,再a1与an-2对换,直到将a(n-1/2)与an-int(n-1)/2)对换。现用

31、循环处理此问题,设两个“位置指示变量”i和j,i的初值为0(指向数组中开始的元素),j的初值为n-1(指向数组中最后的元素)。将ai与aj交换,然后使i的值加1(指向下一个元素),j的值减1(指向前一个元素),再将ai与aj交换,直到i=(n-1)/2为止。,北京邮电大学出版社,程序如下: void inv(int x,int n) /*形参x是数组名*/ 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=5,8,10,9,0,6,7,3,14,1; print

32、f(The original array:n); for(i=0;i10;i+) printf(%d,ai); printf(n); inv(a,10); printf(The array has been inverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n); 程序运行结果: The original array: 5,8,10,9,0,6,7,3,14,1 The array has been inverted: 1,14,3,7,6,0,9,10,8,5,北京邮电大学出版社,例822 用实参为指针变量改写例题821。 void inv

33、(int *x,int n) int *p,m,temp,*i,*j; m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) temp=*i; *i=*j; *j=temp; ,main() int i,arr10=5,8,10,9,0,6,7,3,14,1,*p; p=arr; printf(The original array:n); for(i=0;i10;i+,p+) printf(%d,*p); printf(n); p=arr; inv(p,10); printf(The array has been inverted:n); for(p=

34、arr;parr+10;p+) printf(%d,*p); printf(n); 注意:main函数中的指针变量p是有确定值的。即如果用指针变量作为实参,必须要使指针变量有确定值,指向一个已定义的数组。,北京邮电大学出版社,例8.23 用选择法对10个整数排序。 main() int *p,i,a10=3,7,9,11,0,6,7,5,4,2; printf(The original array:n); for(i=0;i10;i+) printf(%d,ai); printf(n); p=a; sort(p,10); for(p=a,i=0;i10;i+) printf(%d ,*p);

35、p+; printf(n); ,sort(int x,int n) int i,j,k,t; for(i=0;ixk) k=j; if(k!=i) t=xi;xi=xk;xk=t; 程序运行结果: The original array: 3,7,9,11,0,6,7,5,4,2, 0 2 3 4 5 6 7 7 9 11 说明:函数sort用数组名作为形参,也可改为用指针变量,这时函数的首部可以改为: sort(int *x,int n) 其他可一律不改。,北京邮电大学出版社,8.5.3函数返回值是指针 函数的返回值可以是指针,返回指针的函数一般说明形式应该是: 数据类型 *函数名(参数列表)

36、 “数据类型”后面的*表示函数的返回值是一个指向该数据类型的指针。注意,此时说明的是函数,而不是指针变量。 例8.24 使用函数求两个数的最大值。 #include int *max(int *p1,int *p2) int *p; p=*p1*p2?p1:p2; return (p); ,北京邮电大学出版社,main() int a,b,*pmax; printf(Enter a b:); scanf(%d%d, 程序运行结果: Enter a b: 10 20 max=20 说明:函数max返回值的类型是整型指针,在函数max中使指针变量p指向大的数8,然后把p的值返回给函数max。在主函

37、数中把函数max的值赋给pmax,最后输出pmax所指的值为20。,北京邮电大学出版社,8.5.4 指向函数的指针 在C语言中,指针的使用方法非常灵活,指向函数的指针就是一个在其它高级语言中非常罕见的功能。在定义一个函数后,编译系统就为每个函数确定了一个入口地址,当调用该函数的时候,系统就会从这个“入口地址”开始执行该函数。存放函数的入口地址的指针变量就是一个指向函数的指针。其定义方式为: 类型标识符(*指针变量)(); 类型标识符为函数返回值的类型。特别值得注意的是,由于C语言中()的优先级比*高,因此,“*指针变量”外部必须用括号,否则指针变量首先与后面的()结合,就是前面介绍的“函数返回

38、值是指针”。试比较下面两个说明语句: int (*pf)(); /*定义一个指向函数的指针,该函数的返回值为整型数据*/ int *f(); /*定义一个返回值为指针的函数,该指针指向一个整型数据*/ 和变量的指针一样,函数的指针也必须赋初值,才能指向具体的函数。由于函数名代表了该函数的入口地址,因此,一个简单的方法就是直接用函数名为函数指针赋值,即: 函数指针名=函数名;,北京邮电大学出版社,例如: double fun(); /*函数原型声明*/ double (*f)(); /*函数指针说明*/ f=fun; /*f指向fun函数*/ 函数的指针经定义和初始化之后,在程序中就可以引用该指

39、针,目的是调用被指针所指的函数,由此可见,使用函数的指针增加了函数的调用方式。 例8.25 用指针调用函数,实现输出两个数中的较大数 #include main() int max(int,int); int (*pf)(); int a,b,c; pf=max; scanf(%d%d, ,北京邮电大学出版社,max(int a,int b) return (ab?a:b); 程序运行结果: 8 10 a=8,b=10,max=10 在该例中,语句c=(*pf)(a,b)等价于c=max(a,b),因此当一个指针指向一个函数时,通过访问该指针,就可以访问它所指向的函数。 需要注意的是:一个函数

40、指针可以先后指向不同的函数,将哪个函数的地址赋给它,它就指向哪个函数,使用该指针,就可以调用哪个函数,但是,必须用函数的地址为函数指针赋值。另外,如果有函数指针(*pf)( ),则pf+,pf+n,pf等运算是无意义的。 引用函数指针,除了增加函数的调用方式之外,还可以将其作为函数的参数,在函数中传递地址数据,这是C语言中一个比较深入的问题,可以参考其它的书籍。,北京邮电大学出版社,8.6 指针数组,8.6.1指针数组 一个数组的元素都是指针则称为指针数组。指针数组是一组有序的指针的集合。指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。 指针数组说明的一般形式为: 类型

41、说明符 *数组名数组长度; 其中类型说明符为指针值所指向的变量的类型。 例如: int *pa3; 表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量。 注意:不要写成 int (*pa)3;这是一个指向一维数组的指针变量(该一维数组包括三个元素),在前面章节中已学过。 为什么要用指针数组呢?它比较适合于用来指向若干个字符串,使字符串处理更加方便灵活。这时指针数组的每个元素被赋予一个字符串的首地址。指向字符串的指针数组的初始化更为简单。,北京邮电大学出版社,例如: char *name=Sunday,Monday,Tuesday,Wednesday,Thursday

42、, Friday,Saturday; 完成这个初始化赋值之后,name0即指向字符串Sunday,name1指向Monday, 例 8.26 输入数字0-6,输出对应的星期几的英文名称。 # include char *week_day7=Sunday,Monday,Tuesday,Wednesday, Thursday,Friday,Saturday; main() int day; char *p,*lookstr(); printf(Enter Day:); scanf(%d, ,char *lookstr(table ,day) char *table; int day; int i;

43、 for(i=0;i!=day ,北京邮电大学出版社,8.6.2 main函数的参数 指针数组的一个重要应用是作为main函数的形参。在我们以前的学习过程中,main函数的第一行全部写成了以下的形式: main() 括号中为空,表示没有参数,实际上main函数是可以带参数的,其一般形式为: main(int argc,char *argv ) 其中形参argc表示命令行参数的个数,形参argv是指向命令行参数的指针数组。,北京邮电大学出版社,在操作系统下运行C程序时,可以以命令行参数形式向main函数传递参数。命令行参数的一般形式是: 运行文件名 参数1 参数2 参数n 运行文件名和参数之间、各个参数之间要用一个空格分隔。 argc表示命令行参数的个数(包括运行文件名),argv是指向命令行参数的指针数组,指针数组元素argv0指向的字符串是运行文件名,argv1指向的字符串是命令行中的参数1,argv2指向的字符串是命令行中的参数2,等等。 例8.27下列文件的运行文件名为TEST1

温馨提示

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

评论

0/150

提交评论