




已阅读5页,还剩192页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章 指针 重点: 指针的概念、指针的运算、指针的应用 难点: 指针概念的建立 2004年11月1日 10.1 指针的概念 1 地址 内存区的每个字节有一个编号,这就是“地址”。 内存 字节 地址 旅馆 房间 房间号 在地址所标志的单元中存放数据,相当于房间中住 旅客一样。 凡在程序中定义的变量, 在编译时,系统都给它们分 配相应的存储单元。如,一 般微机C系统给int 变量分配2 字节,给float变量分配4字节 。每个变量所占用的存储单 元都有确定的地址。 例如: int a = 3 , b = 4; float c = 4.5 , d=8.6 ; char e = w , f=y ; 它们在内存中的情况如右图 所示: 变量的地址 变量的地址:是其所 占存储单元第一个字节的 编号,是用: 实际上,在编译时,在内存中不再出现变量, 而只有地址将键盘输入的一 个数存到1012开始的2个字节的整型存储单元中 。 由于通过变量的地址能找到变量的存储单元 ,我们说地址“指向”该变量单元。 路牌路 变量地址变量存储单元 指向 指向 在C中,将这种“指向”形象化为指针。在三叉 路口,路牌就是一个指针,它指向某一目的地 ;变量的地址它指向变量的存储单元,因此变 量的地址就是变量的指针。若一个变量的地址 为2000,可以说变量的指针为2000。 房间号 房间 指向 3 变量的指针 下图:a的地址为1010,即a的指针为1010,也就是 1010指向a的存储单元。如同房间号1010指向1010房 间。 4 直接访问方式 这种按变量地址存取变量值的方式,称为“直 接存取”方式或称“直接访问”方式。 5 5 “间接存取间接存取”方式或称方式或称“间接访问间接访问”方式:先方式:先 找到存放找到存放b b的地址的变量的地址的变量pbpb,从中取出从中取出b b的地址,的地址, 然后对然后对10121012开始的开始的2 2个字节的整型存储单元进行个字节的整型存储单元进行 存取操作。存取操作。 6 指针变量 存放地址的变量是一种特殊变量(地址变量或指针变 量),它只能用来存放地址。根据上图所示的逻辑关 系,可以把它们形象地表示为下图: 指向 指向 指向 指向 指向 指向 小结: 地址:内存中每个字节的编号 变量的地址:指着是变量所占存诸单元第 一个字节的地址。 指针变量:其值为地址的变量 指向:是通过地址来体现,通过地址能找 到所需的变量单元,可以说,地址指向 该变量单元。 char *p2; float *p3; 说明:1) 当*出现在声明中,说明p1、 p2、 p3为指针变 量 (2) 指针变量有确定的指向的数据类型。 intint *p1*p1; ;中中intint是指:所定义的指针变量是指向整型值的是指:所定义的指针变量是指向整型值的 指针变量,或者说指针变量,或者说p1p1只能存放整型数据的地址,也就是说只能存放整型数据的地址,也就是说 p1p1只能用来指向整型数据;只能用来指向整型数据; intint 就是指针变量的就是指针变量的基类型基类型, 指针变量的基类型用来指定该指针变量可以指向的数据的指针变量的基类型用来指定该指针变量可以指向的数据的 类型。类型。 pa、pc等分别指向不同数据类型的指针变量, 它们的共同点:1)值为地址,2)它们的存储单 元空间是一样的。 一个指向char的指针和一个指向int的指针不同点: 其实,指针本身只有一种,指针变量存放的值都是 内存地址。在定义指针时,定义指针所指向的数 据类型的目的是说明如何解释指针所指向的空间 的数据。 0x30 0x31 0x32 0x33 0x0 0x0065FDED 0x0065FDEE 0x0065FDEF 0x0065FDF0 0x0065FDF1 如果有一个整型指针p指向了地址 0x0065FDED,那么系统就会将 指针指向的地址开始的2个字节当 成整数值来解释;而如果一个字符 指针s指向了地址0x0065FDED, 那么系统会认为这里存放了一个字 符串。 在定义指针变量时要注意: 1 一般形式:基类型 *指针变量名 2 不能用一个整数给一个指针变量赋初值 int *p=2000; 写此语句的原意可能是想将地址2000作为指针变 量p的初值,但编译系统并不把2000认为是地址 ,而认为是整数,因此认为是语法错误。 3 在定义指针变量时必须指明基类型。 float *p;p+;说明p只能指向类型为实型的变量 ,且使指针移动1个位置意味着移动4个字节。 二、指针变量的引用 1 有两个与指针变量有关的运算符 float *pf= char ch; char *str= int t,k; int *p1= 错误着是: p1= pf= str= 2)同类型的指针变量之间可以互相赋值 int t1=1; int *p1,*p2; p1= p2=p1; 3)不同类型的指针变量之间可以通过类型强制转换互 相赋值 例10.1 #include void main() int a=2,*b,*k= float c=2.3,*d; b=(int *) d=(float *)k; printf(“%4d%4d%f”,*b,*k,*d); 4)可以将NULL(0)赋给指针变量,它表示指针变量 为空,即该指针变量不指向任何存储单元。 3、用指针变量对变量赋值 如: int i , j , *p; p= *p=3; j=*p*2; p= 的意义为指针变量p指向变量 i。 注意:p是地址变量, *p 是非地址变量,与i是一回事。 例10.1 main() int a; int *aptr; a=7; aptr= printf(“%dn%dn”, printf(“%4d%4dn”,a,*aptr); 运行结果为:0012FED4 0012FED4 7 7 例10.2 main() int a,b; int *pointer_1,*pointer_2; a100;b=10; pointer_1 关于运算符 p1=p2= p=a=3; (*p)+; *p+; *(+p); 例10.3 输入a和b两个整数,按先大后小的顺序输出a和b 。 #include main() int *p1,*p2,*p,a,b; scanf(“d,d“, p1=a;p2=b; if(ab) p=p1;pl=p2;p2=p; printf(“na=d,b=d”,a,b); printf(“max=d,min=dn“,*pl,*p2); 三、指针变量作为函数参数 值传递方式:函数的形参为变量;实参可以是变 量、常量、表达式。 地址传递方式:函数的形参可以是指针变量,实 参 可以为变量的指针或指向变量的指针变量。 功能:将一个变量的地址传送到另一函数中,实 参 和形参均可用指针。 例10.4 计算整数立方函数 方法之一:值传递方式 int cube_value(int n) return n*n*n; void main() int number=5; printf(“number is %dn”,number); printf(“number is %dn” ,cube_value(number); 例10.4 计算整数立方函数 方法之二:地址传递方式 int cube_value(int *nptr) *nptr=(*nptr)*(*nptr)*(*nptr); void main() int number=5; printf(“number is %dn”,number); cube_value( printf(“number is %dn”,number); 例10.5 对输入的两个整数按大小顺序输出。今用函 数处理,而且用指针类型的数据作函数参数程序如下 : swap(p1,p2) int *p1,*p2; int p; p=*p1;*p1=*p2;*p2=p; main() int a,b; int *ptr_1, *ptr_2; scanf(“d,d”, ptr_1 if(ab) swap(ptr_1 ,ptr_2); printf(“nd,dn“a,b); 调用函数时可以改变实参 指针变量所指向变量的值。 例10.5 程序可修改为: swap(p1,p2) int *p1,*p2; int p; p=*p1;*p1=*p2;*p2=p; main() int a,b; scanf(“d,d”, if(ab) swap( 下面例子不能正确交换数据: swap(pl,p2) int *p1,*p2; int *p; ppl;p1=p2;p2p; main() int a,b; int *ptr_1,*ptr_2; scanf(“dd”, 调用函数时不会改变实参 指针变量的值,但可以改 变实参指针变量所指向变 量的值;实参和形参指针 变量的传递是单向的。 例10.6 输入a、b、c三个整数,按大小顺序输出。 swap(pt1 ,pt2) int *pt1,*pt2; int p; p=*pt1; *ptl=*pt2;*pt2=p; exchange (q1,q2,q3) int *q1,*q2,*q3; if(*ql main() static int i,a10=0,1,2,3,4,5,6,7,8,9; printf(“the orginal array:n“); for(i=0;i main() static int i,a10=0,1,2,3,4,5,6,7,8,9; int *p=a; printf(“the orginal array:n“); for(i=0;imax) max=*p; else if(*pmax) max=*p; else if(*pmax) max=*(a+i); if(*(a+i)0;i-) *(p+i) =*(p+i-1) 然后把中间变量的值赋给*P 7123456 第二次调用该函数 7712345 6712345 for(i=N-1;i0;i-) *(p+i) =*(p+i-1) 该函数总共调用m次 才能完成以上功能 #include #define N 7 void move(int *t,int n,int m) int *k,i; i=*(t+n-1); for(k=t+n-1;k=t+1;k-) *k=*(k-1); t0=i; m-; if(m0) move(t,n,m); void main() int m,k; int aN; printf(“please input to m:n“); while(1) scanf(“%d“, if(m #define N 10 /*方便修改数组的长度*/ void main() int i,k,m,aN,*p; /*k是用来报数,m是退出人数,i用来循环计数*/ p=a; for (i=0;i void main() int a34; int *p; for (p=a0;p #define N 5 void move() int aNN,i,j,*max,*min1,*min2,*min3,*min4; int temp; int (*p)5=a; for (i=0;i*max) max=*(p+i)+j; else if(*(*(p+i)+j)*(*(p+0)+0) min2=*(p+i)+j; temp=*(*(p+0)+4);*(*(p+0)+4)=*min2;*min2=temp;/*交换*/ for (i=0;i*(*(p+0)+4) min3=*(p+i)+j; temp=*(*(p+4)+0);*(*(p+4)+0)=*min3;*min3=temp; /交换 for (i=0;i*(*(p+4)+0) min4=*(p+i)+j; temp=*(*(p+4)+4);*(*(p+4)+4)=*min4;*min4=temp; /交换 for (i=0;i #define N 10 void main() void average(float (*p)5,int n); void found1(float (*p)5,int n); void found2(float (*p)5,int n); float a45=90,32,78,12,80,90,89,90,87,99,89,87,67,76,56, 76,87,30,65,70; average(a,4); found1(a,4); found2(a,4); /*求第一门课的平均分*/ void average(float (*p)5,int n) int i; float sum=0; for (i=0;i=2) printf(“有2门以上不及格学生的学号:%dn“,i+1); printf(“其成绩为:“); for (j=0;j85) m+; if(m=5)|(sum/5=90) printf(“学号是:%dn“,i+1); 10. 4 字符串的指针和指向字符串的指针变量 重点:(1)字符串指针的定义 、 引用及作函数参数 ; (2)字符串指针变量与 字符数组的区别。 一、字符串的表示形式 1、用字符数组 如: char a 10=“CHINA”; 2、用字符指针 例10.17 main() char *string=“I love China !”; printf(“%sn”,string); char *string=“I love China !”; 等价于下面两行: char *string; string =“I love China !”; 在程序中定义了一个字符指针变量string ,用字符串“I love China !”对它初始化,对字符指针变量的初始化实 际上是把字符串第一个元素的地址赋给string。 printf(“%s”,string); 在输出时,系统先输出string所指向 的第一个字符数据,然后使string自动加1,使之指向 下一个字符,然后输出直至遇到字符串结束标志 。 而字符数组不允许这样: char s20; s=“I love China !”; 请大家思考使s数组元素得到值的 方法? 对字符串中字符的存取,可用下标法,也可以用指针 法。 例10.18 将字符串a复制到字符串b。 main() /*指针法*/ char a=“I am a boy.“,b20; int i; for (i=0;*(a+i)!=0;i+) *(b+i)=*(a+i); *(b+i)=0; printf(“string a is: %sn“,a); printf(“string b is: %sn“,b); 例10.19 用指针变量来处理例10.18。 main() /*通过指针变量来处理*/ char a=“I am a boy.“,b20,*p1,*p2; int i; p1=a; p2=b; for (;*p1!=0;p1+,p2+) *p2=*p1; *p2=0; p1=a; p2=b; printf(“%sn%sn”,p1,p2); 二、字符串指针作函数参数 实参是字符串、字符数组名或字符串指针,传递的是 地址。在被调函数中改变后,可在主调函数中得到改 变后的字符串。 例 10.20 用函数调用实现字符串的复制。 (1)用字符数组名作参数 void copy_string(from,to) char from,to; int i=0; while(fromi!=0) toi=fromi;i+; toi=0; main() char a=“I am a teacher.“,b=“you are student.“; printf(“string a is: %sn“,a); printf(“string b is: %sn“,b); copy_string(a,b); printf(“string a is: %sn“,a); printf(“string b is: %sn“,b); (2)形参和实参分别用字符指针变量 void copy_string(from,to) char *from,*to; int i=0; for(;*from!=0,from+,to+) *to=*from; *to=0; main() char *a=“I am a teacher.”; char *b=“you are a student.“; printf(“string a is: %sn“,a); printf(“string b is: %sn“,b); copy_string(a,b); printf(“string a is: %sn“,a); printf(“string b is: %sn“,b); (3)函数体 的几种简化形式 1) void copy_string(from,to) char *from,*to; while(*to=*from)!=0) to+;from+; 2)void copy_string(from,to) char *from,*to; while(*to+=*from+)!=0) ; 3)void copy_string(from,to) char *from,*to; while(*from!=0) *to+=*from+; *to=0; 4)void copy_string(from,to) char *from,*to; while(*to+=*from+) ; 5) void copy_string(from,to) char *from,*to; for(;(*to+=*from+)!=0;) ; 6) 用字符数组 void copy_string(from,to) char from ,to ; char *p1,*p2; p1=from; p2=to; while(*p2+=*p1+)!=0); 三、字符指针变量与字符数组 虽二者均能实现对字符串的存储和计算,但二者有区 别,主要有以下几点: 1、字符数组由元素组成,元素中放字符;字符指 针变量放地址(如字符串的首地址等); 2、赋初值的方式不同;对字符数组赋初值一般用 static 初始化, 如 static char str =“I love China!”; 而字符指针变量赋初值一般不用static,如: char *p=“I love China!”; 3、赋值方式不同 (1)对字符数组要么赋初值(即定义时赋值),要 么 对元素赋值,下面的赋值方式是错误的: char str14; str=“I love China!”; (2)字符指针变量赋值一般可赋初值,或先定义后赋 值,如 char *a; a= “I love China!”; 等价于: char *a= “I love China!”; 4、定义字符数组时,编译后便分配了存储单元,但 存储单元的值为空; 如: char str10; scanf(“%s”,str); 为正确, 但 char *a; scanf(“%s”,a); 为错误的, 而 char *a, str10; a=str; scanf(“%s”,a); 为正确的 。 5、字符指针变量的值可改变; 例 10.21 main() char *a=“I love China“; a=a+7; printf(“%s“,a); 而数组名代表数组的首地址,为地址常量,其值不能改 变 main() char a=“I love China“; a=a+7; printf(“%s“,a); 6、字符指针也可用下标法来表示: 例 10.22 main() char *a=“I love China!“; int i; printf(“The sixth character is %cn“,a5); for(i=0;ai!=0;i+) printf(“%c“,ai); 运行结果为: The sixth character is e I love China! 10. 5 函数的指针和指向函数的指针变量 重点:函数指针的概念及指向函数的指针变量 用指向函数的指针变量作函数参数 一、函数的指针及指向函数的指针变量 1、函数指针的概念 一个函数在编译时被分配一个入口地址,这个入口 地址称为函数的指针,函数名代表函数的入口地址 。 2、指向函数的指针变量 定义的一般形式: 数据类型标识符 (*指针变量名)( ) 例:int (*f1)(int); /*定义一个函数指针f1,它所指向的函数具有一个整型参数, 返回类型整型*/ void (*f2)( ); float (*f3)(float ); 由于函数名表示该函数的入口地址,因此可 以通过函数名赋给函数指针的方法,使函数 指针指向某个函数。前提是函数的参数与返 回类型必须与函数指针的参数与类型一致。 int fun1(int n); void fun2( ); float fun3(float k); int (*f1)(int); void (*f2)( ); float (*f3)(float ); f1=fun1; f1 fun1() f2=fun2; f2 fun2() f3=fun3; f3 fun3() 当指向函数的指针指向某一函 数之后,可以通过指针变量调 用函数: (*f1)(3); f1(3); fun1(3); 这三个语句作用是一样的 例1: int max(int a,int b) int x; if (ab) x=a; else x=b; return x; main( ) int x,y; int (*p)(int,int); p=max; /*p为指向函数max的指针变量*/ scanf(“%d%d”, printf(“%dn”,(*p)(x,y); printf(“%dn”,max(x,y); 例2:设计一个程序,实现两个数的加、减、乘 、除四则运算。 #include #include float add(float x,float y) return x+y; float sub(float x,float y) return x-y; float mul(float x,float y) return x*y; float dev(float x,float y) if (y!=0) return x/y; else printf(“除数不能为0n”);exit(1); void main( ) float a,b; char c; float (*p)(float,float); printf(“输入计算式:格式为:操作数1 运算符 操作数2:n”); scanf(“%f%c%f”, switch(c) /*根据从终端输入的运算符不同决定p所指的函数*/ case +:p=add;break; case -:p=sub;break; case *:p=mul;break; case /: p=dev;break; printf(“%f %c %f=%fn”,a,c,b,(*p)(a,b); 例3 设计一个菜单驱动函数调用的程序 #include void menu1() printf(“printn”); void menu2() printf(“copyn”); void menu3() printf(“ deleten”); void main() int choice; void (*p )( )=menu1, menu2,menu3; do puts(“1-printn”); puts(“2-copyn”); puts(“3-deleten”); puts(“0-exitn”); scanf(“%d”, switch(choice) case 1: (*p0 )( );break; case 2: (*p1 )( );break; case 3: (*p2 )( );break; case 0:break; while(choice); 请思考如何用while语句 来取代dowhile语句 二、用指向函数的指针变量作函数的参数 传递的是函数的入口地址, 一般的使用形式: : sub( f1, f2); : sub(x1, x2) int (*x1)( ), (*x2)( ); int a,b,i,j; : /* 次主调函数*/ a=(*x1)(i); /*x1、*x2为被调函数 */ b=(*x2)(i,j); : f1 x1 f1 f2 x2 f2 /* /* 主调函数主调函数/*/* /* /* 次次主调函数主调函数/*/* 例10.23 设一个函数process,在调用它时,每次实现不同的功能 ,调用三次,分别求出a、b中较大者、较小者和二者之和。 main() int max(int,int),min(int,int),add(int,int); int process(int,int,int (*p)(int,int); int a,b; printf(“Enter a and b:“); scanf(“%d,%d“, printf(“max=“); process(a,b,max); /*主调函数的实参用函数名*/ printf(“min=“); process(a,b,min); /*一般在嵌套调用中使用*/ printf(“sum=“); process(a,b,add);/*次主调函数对其它函数操作,完成一定的功能; */ printf(“n“); max(x,y) int x,y; int z; return(z=xy?x:y); min(x,y) int x,y; int z; return(z=x main() static float score4=60,70,80,90, 56,89,67,88,34,78,90,66; float *search(float (*)4,int); float *p; int i,m; printf(“enter the number of student:“); scanf(“%d“, printf(“the scores of No.%d are:n“,m+1); p=search(score,m); for(i=0;i int k=0; int *fun1() return int *fun2(int *ptr) return ptr; main() *fun1()=10; printf(“k=%dn”,k); int t=3; *fun2( printf (“t=%dn”,t); 10. 7 指针数组和指向指针的指针 重点:指针数组及其应用 一、指针数组 其元素均为指针型数据的数组,称为指针数组。 定义形式: 类型标识符 *数组名数组长度说明 如: int *p4; 不能写成 int (*p)4 注意: 1) 在使用指针数组中的元素之前,必须为该元素指定 一个确定的值;对指针数组的初始化时其每个元素 的值都为地址。 int i1,i2,i3; int *p3= char *str3=“Guangzhou”,”Biejing”,”Wuhan”; 2) 在使用指针数组元素时,与指针的使用方法一样 #include main() int k4,t; int *p4= for (t=0;t0) k=j; if(k!=i) temp=namei;namei=namek;namek=temp; void print(name,n) char *name;int n; int i; for(i=0;i #include #define M 10 #define N 4 void main() void search(char *,char *,int); char *pN=“aaa“,“bbb“,“ccc“,“ddd“; char objM; /*存放要查找的字符串*/ int i; for (i=0;i highmid=low+(high-low)/2 “111” “222” “333” “444” “555” “666” “777” list0 list1 list2 list3 list4 list5 list6 high low mid 先使high=mid-1; 再使mid=low+(high-low)/2 ; “111” “222” “333” “444” “555” “666” “777” list0 list1 list2 list3 list4 list5 list6 high low mid “111” “222” “333” “444” “555” “666” “777” list0 list1 list2 list3 list4 list5 list6 high low mid 若查找“222”若查找“666” 先使low=mid+1; 再使mid=low+(high-low)/2 ; #include #include #define M 10 void main() void search(char *,char *,int); char *list=“aaa“,“bbb“,“ccc“,“ddd“; char objM; int i; for (i=0;i0) high=mid-1; else puts(“succes! the number=“); printf(“%dn“,mid-list+1); return; puts(“unsucess!n“); 三、指针数组作main函数的参数 指针数组的一个应用是作为main函数的形参。 1 无参主函数 类型标识符 main() 2 有参主函数 类型标识符 main(argc,argv) int argc; char *argv; 问题:(1)实参从何处来 (2)形参的意义 (1) 实参从命令行得到 熟悉DOS程序的同学知道,启动一个程序时,可以 给程序一些参数,例如将一个文件复制到另一个文 件中,用命令: c:copy file1.c file2.c 这个命令中, copy是程序名, file1.c和file2.c是命令 行参数,启动程序所给的命令信息将通过操作系统 传递给程序的main函数,传递的方式是:将命令行 按空格分解成一个个字符串,然后将字符串组织到 一个字符数组中,并且将这个数组连同数组中字符 串的个数值都传递给main函数。 使用一般形式: 文件名 参数1 参数2 参数n (2) 形参的意义 argc : 参数的数目,为整型, int argc 如: file1 China Beijing 为三个参数,传过来后使 argc得到3。 argv : 是字符指针数组名,其元素得到的是命令行各 字符串的首地址, 定义形式为: char *argv 数组长度由命令行各字符串的个数 确定; 如: file1 China Beijing 使argv 的长度为3,argv0指向file1,argv1指向 China, argv2指向Beijing。 3 main函数带参数的例子 考察参数回送命令echo的内容,文件名为 echo.c main(argc,argv) int argc; char *argv ; char *p=argv; while(-argc0) printf(“%s%c”,*+p, (argc1)? : n); 运行,若输入: echo Computer and C Language 回车 则显示: Computer and C Language 10.8 指针型数据小结 一、有关指针的数据类型(见下表) 二、指针运算小结 1、指针变量加减一个整数 如:p+ p- p+i p-i p+=i p-=i 等 实际含义:如 p+i 代表地址计算: p+c*i , c为字节数,整型c=2、实型c=4、字符型 c=1 作用:p是作为指向数组元素的指针变量时 才有使用意义 2、指针变量赋值 如:p= a为变量,p为指针变 量 p=array; array为数组名 p= p=max; max为函数名 p=p2; p2为指针变量 注意:不能把一个整数或常数赋给p,如 p=1000 但可以p=(int *)(1000) (假设p为整型指针) p=NULL; NULL是指针的特殊值,当一个指针不指向任何内 存地址时,可以给它NULL值。在定义一个指针而没 有给它初始化时,指针的值是不确定的,如: int *p;此时 p的值取决于程序运行时内存空间的状 态,所以这个值是随机的。这时,如果访问*p的值, 会导致系统发生异常。 #inlcude #inlcude main() main() int a,b; int a=2,b=3; printf(“%4d%dn”,a,b); printf(“%4d%dn”,a,b); 3、两个指针变量可以相减 如两个指针变量指向同一个数组的元素(如 右图),则 p2-p1=4-1=3 4、两个指针变量比较 若两个指针指向同一个数组的元素,则可以比 较, 如: p1p2 5、注意点 1)指针类型本身只有一种,指针变量存放的值是内 存地址,所以指向不同数据类型的指针所占据的 内存空间是一样的。 2)指针变量定义时所说明的数据类型是用来说明如 果解释指针变量所指向存储单元中的数据的,因 此,如果有不同数据类型的指针指向同一存储单 元,那么,通过指针来间接访问这个内存所得到 的值是不一样的。 3) int *pt,t=3; pt= pv1=pt; printf(“t is %dn”,*pt); printf(“t is %dn”,*(int *) pv1);/*具体使用时要进行类型转换 */ 本章练习 一、填空题 1 专门用来存放某种类型变量的首地址的变量被称为该 种类型的_,它的值类型是_. 2 数组的指针是指数组的_,而数组中某个元素 的指针就是_.指针变量内存放的是数组 的首地址,则它被称为_. 3 指向字符串的指针变量的类型是_,不过它 保存的是字符串的_,或者是_. 4 每一个函数都占用一段内存,在编译时被分配一个_ _,这个是函数的指针,可以让一个指针变 量指向函数,然后就可以通过调用这个指针变量来调 用函数。 5 在带参数的main函数中,main(参数1,参数2),参数1 和参数2就是main的形参,其中参数1是_, 参数2是一个指向字符串的_. 6 如果引用数组元素,可以有两种方法:_,_。 7 在C语言中,实现一个字符串的方法有两种,用_ _实现和用_实现。 以下程序用指针指向三个整型存储单元,输入三个整 数,并保持这三个存储单元中的值不变,选出其中最 小值并输出。 #include main( ) int _; a=(int *)malloc(sizeof(int); b=(int *)malloc(sizeof(int); c=(int *)malloc(sizeof(int); min=(int *)malloc(sizeof(int); printf(“输入三个整数n”); scanf(“%d%d%d”,_); printf(“输出以上整数:%d%d%dn”,_); *min=*a; if(*min*b) _; if(_*c) _; printf(“输出最小的整数:%d”,_); 9 阅读下面的程序,若要得到如下的运行结果: Follow me Basic Fortran Great Wall Computer design 请将程序补充完整 main( ) static char *name=“Follow me”, “Basic”, “Fortran”, “Great Wall”, “Computer design”; char *ip; int t; for (t=0;t #include main( ) char *s1=“AbDeG”; char *s2=“AbdEg”; s1+=2;s2+=2; printf(“%dn”,strcmp(s1,s2); 正数 负数 零 不确定的值 10. 当运行以下程序时,从键盘输入MyBooK回车 ,则下面程序的运行结果是_。 #include char fun(char *s) if (*s=A) *s+=32; return *s; main( ) char c80,*p; p=c; scanf(“%s”,p); while(*p) *p=fun(p);putchar(*p);p+; printf(“n”); A) mY bOOK B) my book C) my D) My Book 11. 下面程序的运行结果是_ #include #include fun(char *s) char a7; s=a; strcpy(a,”look”); main() char *p; fun(p); puts(p); A) look B) look C) look D) 不确定的值 表示空格 12.若有定义:int a23;则对a数组的第I行j列元 素值的正确引用是_ A) *(*(a+i)+j) (a+i)j *(a+i+j) D) *(a+i)+j 13 以下程序的输出结果是_ char cchar(char ch) if (ch=A if (*p1*p2) p=*p1;*p1=*p2;*p2=p; main() int a,b,c; scanf(“%d%d%d“, printf(“n%4d%4d%4dn“,a,b,c); if(ab) sort( if(ac) sort( if(bc) sort( printf(“%4d%4d%4dn“,a,b,c); 10.2 输入三个字符串, 按由小到大的顺序输出 str0第一个字符串 “china” str1第
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年工程管理领域专业技能考核与题型分析及模拟题
- 2025年初级摄影技巧进阶教程与实战模拟题集
- 2025年京东物流仓储经理招聘考试预测题
- 抢救课件标题
- 2025年子宫收缩药项目建议书
- 2025年碳酸乙烯酯项目发展计划
- 2025年巷道式智能化孵化器项目合作计划书
- 动物伦理学题库及答案
- 扫地车安全培训技术交底课件
- 2025年文化行业专业考试题及答案
- 高等数学上册ppt课件完整版
- 网店美工与视觉设计全书ppt完整版课件最全电子教案正本书教学教程
- 胸部检查(二)肺与胸膜检查
- 《中国古典舞》PPT课件
- 小学生个人简历WORD模板
- 医院临床科主任考核测评表
- 大国工匠精神PPT课件
- 中交二公局大西铁路大荔特大桥项目部拌合站管理制度汇编
- SKS0220SE说明书
- 家委会职责分工表
- 吸力锚的抗拔承载力分析
评论
0/150
提交评论