1、第七章 数组和指针,数组: 是按一定格式排列起来的一系列具有同一属性的项目。 例如: 向量、矩阵、立体矩阵等。a11 a12 a13 a21 a22 a23 a31 a32 a33 数组名: 表示群体的共性(具有同一种数据类型) 下标: 表示个体的个性(各自占有独立的单元),7.1 数组及数组元素 7.1.1 一维数组,一维数组的定义方式: 类型说明符 数组名常量表达式; 数组名遵循标识符命名规则 常量表达式表示元素的个数,即数组长度。 例如:int a10; 数组元素的表示形式:数组名下标 其中,下标:是整型常量或整型表达式。对于任何数组,下标都从0开始。,例7.1用气泡法完成对10个数从小
2、到大排序。第一趟扫描找到了最小的数存入a0,其过程如下: a1 a2 a3 a4 a5 a6 a7 a8 a9 a10,4 5 3 1 2 6 9 7 8 0,4 5 3 1 2 6 9 0 7 8,4 5 3 1 2 6 9 7 0 8,4 5 3 1 2 6 0 9 7 8,4 5 3 1 2 6 9 0 7 8,4 5 3 1 2 6 9 7 0 8,4 5 3 1 2 6 0 9 7 8,4 5 3 1 2 0 6 9 7 8,4 5 3 1 2 0 6 9 7 8,4 5 3 1 0 2 6 9 7 8,4 5 3 1 0 2 6 9 7 8,4 5 3 0 1 2 6 9 7 8,
3、4 5 3 0 1 2 6 9 7 8,4 5 0 3 1 2 6 9 7 8,4 5 0 3 1 2 6 9 7 8,4 0 5 3 1 2 6 9 7 8,4 0 5 3 1 2 6 9 7 8,0 4 5 3 1 2 6 9 7 8,第二趟扫描找到第二小的数存入a2,直到第九趟扫描,便可找到最大的数存入a10,其过程如下: a1 a2 a3 a4 a5 a6 a7 a8 a9 a10,0 1 4 5 3 2 6 7 9 8,0 1 2 4 5 3 6 7 8 9,0 1 2 3 4 5 6 7 8 9,0 1 2 3 4 5 6 7 8 9,0 1 2 3 4 5 6 7 8 9,0 1
4、 2 3 4 5 6 7 8 9,0 1 2 3 4 5 6 7 8 9,0 1 2 3 4 5 6 7 8 9,main() int a11,i,j,t;printf(“input ten numbers:n”);for(i=1;ii;j-)if(aj-1aj) t=aj;aj=aj-1;aj-1=t;printf(“the sorted numbers:n”);for(i=0;i11;i+) printf(“%d”,ai); ,7.1.1一维数组,上述程序有许多值得改进的地方。 (1)在9趟由底向上的扫描中,可能最后几趟已无任何交换发生,程序应能做到,一旦发现某趟扫描中无任何交换时就会终止
5、; (2)在每趟扫描中,上趟扫描中最后一次交换的位置k是至关重要的,因为当jk时,将再也没有任何交换发生,从而应该在此结束此趟扫描; (3)为使算法具有对称性,扫描的方向有两种可能的选择,一是使轻气泡上浮,一是使重气泡下沉。,7.1.1一维数组,例:用选择法排序。即先将10个数中最小的数与a0对换;再将a1到a9中最小的数与a1对换;每比较一轮,找出一个未经排序的数中最小的一个。共应比较9轮。,int a10,i,j,k,t; 初始化数组 i=0;i9; k=i; j=i+1;j9;,ajak?,Y,N,k=j,t=ak;ak=ai;ai=t;,共比9轮,记住该换的位置,寻找第k小的数aj,7
6、.1.2 二维数组,二维数组的一般定义形式为: 类型说明符 数组名常量表达式常量表达式; 例如:float a34; 二维数组元素的表示形式为:数组名下标1下标2 下标1:称为行下标/下标2:称为列下标,a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23,例7.2将44的矩阵转置并输出。,main() float a44,t;int i,jfor(i=0;i4;i+)for(j=0;j4;j+)scanf(“%f”, ,0.0 0.1 0.2 0.3 1.0 1.1 1.2 1.3 2.0 2.1 2.2 2.3 3.0 3.1 3.2 3.3,0.
7、0 1.0 2.0 3.0 0.1 1.1 2.1 3.1 0.2 1.2 2.2 3.2 0.3 1.3 2.3 3.3,7.1.3 多维数组,多维数组:多于二维的数组。 多维数组的定义、数组元素的引用:与二维数组类似,只是需要相应维数的下标。 例如:int cube564; /*三维数组*/float data3492;/*四维数组*/cube013=20;data1051=0.0;,1.同一个数组中的所有元素占用一组连续的存储空间; 2.数组的存储分配按行进行; 3.数组名字表示该数组的首元素地址。 对于一维数组而言,各元素按下标次序依次存放, 如a0,a1,a2,等等。且有:&a0:
8、&a1: &a2:,7.2 数组的存储表示,数组中任一元素ai的地址可表示为:设 ch=FFE0,a=FFEA 则&ch0=FFE0+0*1=FFE0 &a0=FFEA+0*2=FFEA&ch1=FFE0+1*1=FFE1 &a1=FFEA+1*2=FFEC &ch9=FFE0+9*1=FFE9 &a9=FFEA+9*2=FFFC 语言不对下标是否越界进行检查,语言编译程序将实际指向分配给数组x的存储空间以外的存储区域。,7.2 数组的存储表示,二维数组:按行存放 例如:int x23/*它有23个数组元素*/ x00 x01 x02 x10 x11 x12 其存储分配顺序为:x00x01 x
9、02 x10 x11 x12 &x00 &x01 &x02 &x10 &x11 &x12,中的二维数组可以看作是一种特殊的一维数组。 例如float a34;a0 a00 a01 a02 a03 a- a1 a10 a11 a12 a13 a2 a20 a21 a22 a23 二维数组元素aij的地址可以这样得到:&aij=ai+j*sizeof(a00)=a+i*sizeof(a0)+j*sizeof(a00) =a+i*16+j*4 例:&a12=a+1*16+2*4=a+24,7.2 数组的存储表示,多维数组元素在内存中的排序顺序为:第一维的下标变化最慢,最右边的下标变化最快。 例如,f
10、loat a234;,a000a001a002a003 a010a011a012a013 a020a021a022a023,a100a101a102a103 a110a111a112a113 a120a121a122a123,给出三维数组数组元素的地址计算公式。,7.3 数组的初始化,语言规定只有静态存储类(static)和外部存储类(extern)的数组才能初始化。例如:static int a10=0,1,2,3,4,5,6,7,8,9; 这里必须将各数组元素的初值放在一对花括号内。编译程序按数组元素的存放顺序依次对其赋值。 也可以对数组中的部分元素初始化,对静态数组而言,没有初始化的数组
11、元素,系统会将它自动置0。,在对全部数组元素初始化时,可以不指定数组的长度。例如:static int a5=1,2,3,4,5; 可以写成:static int a=1,2,3,4,5; 在第二种写法中,花括号中有5个数,系统就会据此自动定义数组a的长度是5。 若是二维数组。则在定义数组时对第一维的长度可以不指定,但第二维的长度不能省略.,7.3 数组的初始化,对二维数组的初始化可以分行进行,如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12;static int a 4=1,2,3,4,5,6,7,8,9,10,11,12; 另一种办法是将所有数据写在一
12、个花括号内,如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12;static int a 4=1,2,3,4,5,6,7,8,9,10,11,12; 按数组中各元素的排列顺序依次赋值。,7.3 数组的初始化,例 7.3 用数组来求斐波那契数列。 main() int i;static int a20=1,1;for(i=2;i20;i+)ai=ai-2+ai-1;for(i=0;i20;i+)printf(“%d”,ai); ,7.3 数组的初始化,7.4 数组作为函数参数 7.4.1 函数参数的传递方式,函数参数传递方式:“值传递”和“地址传递” “值传递
13、”:把计算出的实参的值赋给形参.形参和实参在存储空间上是分开的。数组元素可以作为函数的实参,其效果与简单变量相同。 “地址传递”:把实际参数的地址传递给形式参数,这样形参与实参共享同一存储空间,对形参的修改实质就是对实参的修改,语言虽不直接提供“地址传递”,但可以借助指针来模拟实现。,7.4.2 数组名作为函数的参数,在语言中允许数组名作函数的参数,此时实参与形参都用数组名。fun(x) main()int x; int a=1,2; int t; fun(a);t=x0; printf(“%d,”,a0);x0=x1; printf(“%dn”,a1);x1=t; 结果: 2,1,说明: 1
14、.语言中形参数组名是变量,而实参数组名是常量. 2.在用数组名作实参时,应注意与形参数组的类型相一致。 3.形参数组可以定义大小,也可以不指定大小。 4.若是二维数组,可以省略第一维的大小,但不能省略第二维的大小,否则无法进行下标变量的地址变换。 5.若在形参数组定义中没有明确数组元素的个数,可以借助另一个形参来完成。,7.4.2 数组名作为函数的参数,例7.4平台问题。设有序数组中值相同的元素构成一个平台,平台中元素的个数是平台的长度。设计一个函数,求有序整型数组中最长平台之长。,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,1,1,1,
15、2,2,2,3,2,3,4,4,4,4,4,5,i,i,i,i,i,i,i,i,len=2,len=3,i,i,i,i,i,int fun(a,n) int a,n; int len,i;for(len=i=1;in;i+)if(ai=ai-len)len+;return(len); ,main() int b=1,1,1,2,2,2,2,3,3,4,4,4,4,4,5;printf(%d,fun(b,15); ,7.5 字符串变量,7.5.1 字符串变量的表示 在中,用一维字符数组来表示字符串变量. 例如: char str10,str130; 这里定义了两个字符串变量: str、str1
16、为了描述字符串的有效长度,采用0作为字符串的结束标志,扫描整个数组,直到碰见字符0。,字符串变量中存放的字符个数数组长度减1。 可以用字符串常量对字符型数组进行初始化。例如: static char c=“I am a boy”; 也可以省略花括号,直接写成 static char c=“I am a boy”; 注意:不能用赋值方式给字符串变量赋值!,7.5.1 字符串变量的表示,例7.5 把一个字符串中的大写字母改为小写字母,其余不变。 strlwr(s) char s; int i;for(i=0;si!=0;i+)if(si=A ,7.5.1 字符串变量的表示,7.5.2 字符串数组,
17、考虑: char s510; s是一个二维数组,每个元素是一个字符。 s又是一个特殊的一维数组,访问某个字符串i,可以用si。,0 0 0 0 0, 例 7.6 输出某月份的英文名字。 main() int n;static char month14=“illegal month”,“January”,“February”,“March”,“December”; scanf(“ %d ”, ,month0 month1 month2 month3 month12 ,7.5.2 字符串数组,7.5.3 常用字符串处理函数,1. puts(字符串)将给定字符串输出到标准输出设备上。在输出时将字符串
18、结束标志0转换成n,即输出完字符串后换行。 2. gets(字符串)从标准输入设备上读入一个字符串到字符数组中,并且返回一个函数值,该函数值是字符数组的起始地址。,3. strlen(字符串)用以测试字符串的长度。函数值是字符串中字符的个数,不包括0在内。 4. strcpy(字符串1,字符串2)把字符串2拷贝到字符串1中去。例如: static char str1=“student”,str2=“china”; strcpy(str1,str2); 执行后str1的值是“china0t0”。,7.5.3 常用字符串处理函数,5. strcat(字符串1,字符串2):连接两个字符串把字符串2接
19、到字符串1的后面,结果放在字符数组1当中。函数调用后得到一个函数值字符数组1的地址。例:static char str130=“Peoples Republic of”;static char str2=“China”;puts(strcat(str1,str2); 输出为:Peoples Republic of China对于strcat(s1,s2),只要串s1的长度允许且s1和s2两个串不重叠,可以用库函数strcpy这样实现:strcpy(s1+strlen(s1),s2),7.5.3 常用字符串处理函数,6. strcmp(字符串1,字符串2):比较字符串1和字符串2。 对两个字符串
20、自左至右逐个字符比较,直到出现不同的字符或遇到0为止。 如果全部字符相同,则认为相等;若出现不相同的字符,则以第一个不同的字符的比较结果为准。比较的结果由函数值带回。 当字符串1=字符串2时,函数值为0; 当字符串1字符串2时,函数值为一正整数; 当字符串1字符串2时,函数值为一负整数。,7.5.3 常用字符串处理函数,7. strlwr(字符串) 将字符串中的大写字母转换成小写字母。 8. strupr(字符串) 将字符串中的小写字母转换成大写字母。,7.5.3 常用字符串处理函数,例7.7 设计函数delete(str,start,number),在字符串str中从start开始删除num
21、ber个字符。 delete(s,i,n) char s ; int i,n; if(i=0 ,7.5.3 常用字符串处理函数,例如: delete(s,6,2)s,delete(s,i,n) char s; int i,n; if(i=0,7.6 指针,指针:地址普通 数据地址,7.7 指针变量、指针类型及指针运算,指针变量定义的一般形式为:数据类型 *变量名; 例如:int *ptr_int;float *point_1; 其中: &ptr_int: &point_1:,0f0aH,0f0cH,*ptr_int,*point_1,例如: main() int a,b,*ptr_1,*ptr
22、_2;a=10;b=20; ptr_1= 结果: &a=ffda a &b=ffdc b&ptr_1 ptr_1 &ptr_2 ptr_2,10,20,ffda,ffdc,ffda,10,ffdc,20 ffda,10,ffdc,20,运算符&只能作用于在内存中体现地址的对象(在内存中为该对象分配了存储空间),如变量,数组元素等。而形如&(x+3)和&5则是非法的。 取寄存器(register)变量的地址也是非法的。 单目运算符*将它的操作数作为最终目标的地址来对待,并根据那个地址取得相应的内容。,运算符*和&的优先级与!,+,-等相同,是自右到左结合的。 指针变量可以出现在表达式中。 y=*
23、px+3与y=x+3功能相同 d=sqrt(double)*px)是把px的平方根保存在d中。下面这些表达式都是合法的: *px+=6 与x+=6 功能相同 (*px)+与x+相同 *px+ 与(*px)+不同,而是等价于*(px+) &*px 与&x 功能相同 *&x与x等价,说明: 1. px+ 等于 px=px+1*px的类型长度例如: int x2=10,20,*px=x;设 x=ffe4 则 px=ffe4=py=px ,py=px+9 (合法)py=pc (不太合法)py=(int *)pc (合法),7.8 指针作为函数参数,swap(x,y) main() int x,y; i
24、nt a,b; int temp; a=10;temp=x; b=20; x=y; swap(a,b); y=temp; printf(“%d,%d”,a,b); ,在语言中,函数的参数可以是指针类型。 例7.8:写一函数swap,交换两个整型变量的值.,main() swap(px,py) int a,b; int *px,*py;a=10; int temp;b=20; temp=*px;swap( ,例7.9 编写一个程序从键盘上读入一行,并统计在该行里的白空字符和小写字母的个数。 #include int get(ws,lc) int *ws,*lc; int c;*ws=*lc=0;
25、while(c=getchar()!=EOF)switch(c) case :case t: (*ws)+; break;case n: return 1;default: if(c=a ,main() int ws,lc;if(get( 切记:指针变量在引用之前一定要先赋值,否则其所指的地址不定,所引用的是垃圾数据。而对未赋值指针变量所指地址中赋值更会产生灾难性的后果。 如果在主函数中将ws和lc定义为int *ws,*lc,应该如何调用get函数?,7.9 指针和数组,语言中,数组名就是一个指向此数组第0个元素的指针,采用指针访问数组一般会更快些。 例如:int a10,*pa;pa=/*
26、或pa=a*/ 则有: a0,*(a+0),*a,*pa,*(pa+0),pa0等价ai,*(a+i),pai,*(pa+i)等价 执行赋值语句:pa=&a2;或 pa=a+2 则 *pa是a2的值,*(pa+1)是a3的值。 即任何数组中下标表达式都可以写成指针和位移量构成的表达式形式,反之亦然。,数组名和指针变量是有区别的: 1.非形参数组名是指针常量,而不是指针变量, pa=a和pa+等都是有意义的操作; a=pa,a+或p= 这时 x等价于*x, y4等价于(*y)4 则 x+,y+=1 是有意义的操作,7.9 指针和数组,例7.10用气泡法单向排序。,main() int i,a=3
27、,4,2,5,1;sort(a,5);for(i=0;ip+i-1;pj-)if(*(pj-1)*pj) t=*pj;*pj=*(pj-1);*(pj-1)=t; ,3 4 2 5 1, p,当p和pj 不重叠时, pj,main() int num,i,a100;scanf(“%d”, ,例7.10用气泡法上浮下沉排序。,0,n-1,l,r,j,sort(a,n) int a,n; int l,r,k,j,t;for(l=1,r=n-1,k=n;l=1;j-)if(aj-1ajt=aj-1;aj-1=aj;aj=t;k=j;for(j=l=k+1;jaj)t=aj-1;aj-1=aj;aj=
28、t;k=j; ,寻找第l小的数,寻找第r大的数,指针和数组,0.0 0.1 0.2,1.0 1.1 1.2,2.0 2.1 2.2,3.0 3.1 3.2,y0,y1,y2,y3,y,yy0,*(y+0),y y+1y1,*(y+1) y1+2,*(y+1)+2,&y12*(y1+2),*(*(y+1)+2,y12,指针与多维数组。例:float y43,(*py)3,*p;则有:&yij=yi+j=*(y+i)+j *&yij=*(yi+j)=*(*(y+i)+j)=yij由 yi=*(y+i) 则有&yi=&*(y+i)=y+i 说明: &yi和yi的值相同,但意义不同&yi指向行 *(&
29、yi+j)=*(y+i+j)=yi+jyi指向列*(yi+j)=*(*(y+i)+j)=yij,指针和数组,float y43,(*py)3,*p; py=y; 则有: pyij=*(pyi+j)=*(*(py+i)+j) 若有:p=y 则有*p=*(p+0)=y00 *(p+6)=y20*(p+1)=y01 *(p+7)=y21*(p+2)=y02 *(p+8)=y22*(p+3)=y10 *(p+9)=y30*(p+4)=y11 *(p+10)=y31*(p+5)=y12 *(p+11)=y32,指针和数组,例7.11把某月的第几天转换为这年的第几天。反过来,将某年的第几天转换为日期。 s
30、tatic int day_tab13=0,31,28,31,30,31,30,31,31,30,31,30,31, 0,31,29,31,30,31,30,31,31,30,31,30,31;day_of_year(year,month,day) int year,month,day; int i,leap;leap=(year%4=0 ,day_tab0 day_tab1,month_day(year,yearday,pmonth,pday) int year,yearday,*pmonth,*pday; int i,leap,q;leap=(year%4=0 ,指针和数组,采用参数传递方
31、式传递数组day_tab main() static int day_tab13=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31;printf(“%dn”,day_of_year(day_tab,1999,9,9); day_of_year(day_tab,year,month,day) int year,month,day,(*day_tab)13; int i,leap;leap=(year%4=0 ,指针和数组,例7.12有3个学生各学4门课,计算总平均分数, 以及第3个学生的成绩。程
32、序如下: main() void average();void search();static float score34=65,67,70,60,80,87,90,81,90,99,100,98;average(score,12);search(score,2); ,void average(p,n) float *p; int n; float *p_end,sum;sum=0;p_end=p+n;while(pp_end) sum+=*p+;printf(“average=%5.2fn”,sum/n); ,score34=65,67,70,60,80,87,90,81,90,99,100
33、,98,指针和数组,void search(p,n) float (*p)4; int n; int i;printf(“The score of NO %d are:n”,n+1);for(i=0;i4;i+) printf(“%5.2f”,*(*(p+n)+i); ,score34=65,67,70,60,80,87,90,81,90,99,100,98,指针和数组,7.10 指针数组,一个数组的元素都是指针类型的数据,就称这个数组是指针数组。指针数组的定义形式为 类型标识 *数组名元素个数; 例如:int *p4; 由于比*优先级高,因此p先与4结合,形成p4形式,这是一个含有4个元素数
34、组。然后再与p前面的*结合,*表示此数组是指针类型的,每个数组元素都可指向一个整型变量。 注意:不要写成int (*p)4,这里p是指向一维整型数组的指针变量。,例7.13 输入若干行正文,将其排序输出。 main() char *line=“C+“,“Fortran“,“Basic“,“Pascal“,“Foxbase“;int n=5;shellsort(line,n);writeline(line,n);,调用前存储结构,&v:,shellsort(v,n)char *v;int n;char *t;int i,j,k;for(i=0;ii;j-)if(strcmp(vj-1,vj)0)
35、t=vj;vj=vj-1;vj-1=t;,调用后的存储结构,&Line0,&Line1,&Line2,&Line3,&Line4,C+0,Fortran0,Basic0,Pascal0,Foxbase0,&v:,writeline(linp,n)char *linp;int n;int i;for(i=0;in;i+)printf(“%sn“,linpi); 结果:,Basic C+ Fortran Foxbase Pascal,例7.14 编写一个函数,打印如图所示的杨辉三角形。 1 1 1 1 1 1 1 2 1 1 2 1 1 3 3 1 1 3 3 1 1 4 6 4 1 1 4 6
36、4 1,#define MAX 100 prt(n) int n; int *xxMAX,i,j;for(i=0;in;i+)xxi=(int*)malloc(sizeof(int)*(i+1);for(j=0;j=i;j+)if(j=0|j=i) *(xxi+j)=1;else *(xxi+j)=*(xxi-1+j-1)+*(xxi-1+j);printf(%d,*(xxi+j);printf(n); ,: : :,1,1,1,1,2,1,1,3,3,1,1,1,4,6,4,1,&xx0,&xx1,&xx2,&xx3,&xx4,7.11 字符指针和字符串,例如: main() char *s
37、tring=“This is a string!”;printf(“%sn”,string); 其中:char *string=“This is a string!”,等价于下面两行: char *string; string=“This is a string!”;,&string:,字符串输入可以用scanf函数。当在scanf中使用%s时,它跳过空字符直到遇见第一个非空字符,然后读进字符,直到碰见一个空字符结束。例如:输入不超过10个字符的字符串。main() char str11;printf(“Enter a string:”);scanf(“%s”,str);printf(“The
38、 string is:%sn”,str);,定义的字符数组长度是11,但在此例中输入的字符串长不能超过10,否则就会出问题。最好采用%10s来限制输入字符串的长度。下面是用字符指针重写的程序。 main() char *str;str=malloc(11);printf(“Enter a string:”);scanf(“%10s”,str);printf(“The string is:%sn”,str); ,通过字符指针可以把字符串传送到函数中去。例7.15写一个函数strcpy(s,t),把字符串t复制到字符串s中。strcpy(s,t)char s,t;int i;i=0;while(s
39、i=ti)!=0)i+;,strcpy(s,t) char *s,*t; while(*s=*t)!=0)s+;t+; ,把s和t的增量移到测试部分: strcpy(s,t) char *s,*t; while(*s+=*t+)!=0); ,由于字符0的ASCII码值是0,因此,函数可最终化简为: strcpy(s,t) char *s,*t; while(*s+=*t+); ,7.11 字符指针和字符串,例7.16写一函数strcmp(s,t),它比较两个字符串s和t,按字符顺序看s小于t、等于t、大于t确定返回负值、零或正值。返回值是由两个字符串中首次出现不同字符处的字符差值得到的。str
40、cmp(s,t)char *s,*t;for(;*s=*t;s+,t+)if(*s=0) return(0);return(*s-*t);,7.11 字符指针和字符串,例7.17写一个函数求字符串长度。 strlen(s) char *s; char *p;for(p=s;*p;p+);return(p-s); ,P , S,P ,P ,P ,P ,P ,P ,P ,P ,用于串连接的函数。 strcat(s1,s2) char *s1,*s2; s1+=strlen(s1);while(*s1+=*s2+); 请注意,当字符串s1和s2重叠时,这个函数是有副作用的。,7.11 字符指针和字符
41、串,7.12 返回指针的函数和指向函数的指针,带回指针值的函数,一般定义形式为:类型标识符 *函数名(参数表); 例如:int *f(x,y);其中: f:函数名,x,y是函数f的形参。 ( )的优先级高于*,因此f先与( )结合。 f(x,y)前面有个*号,表示此函数是指针型函数(函数的返回值是指针)。 int:返回的指针指向整型变量。,#define NULL 0 /*无效指针*/ #define ALLOCSIZE 1000 /*可用空间大小*/ static char allocbufALLOCSIZE; /*用于分配的存储区*/ static char *allocp=allocbuf;/*自由空间指针*/ char *alloc(n) int n; if(n0 ,例7.18写一个存储空间分配程序alloc(n), 用以分配n个字节的连续存储空间,其返回 值是分得空间的首地址。,可以用指针变量指向整型变量、字符串、数组,还可以指向一个函数。 一个函数在编译时被分配给一个入口地址,这个入口地址就称为该函数的指针。 指向函数的指针变量的一般定义形式为:数据类型 (*指针变量名)( ); 例如 int (*p)(); 这里定义了一个变量p,它是一个指向函数的指针变量,这个函数的返回值是整型量。,