指针主要内容的习题及答案
一.选择题
1.变量的指针,其含义是指该变量的 B 。
A)值B)地址C)名D)一个标志2.已有定义int k=2;int *ptr1,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是 B 。
A)k=*ptr1+*ptr2 B)ptr2=k C)ptr1=ptr2 D)k=*ptr1*(*ptr2) 3.若有说明:int *p,m=5,n;以下程序段正确的是 D 。
A)p=&n ; B)p = &n ;
scanf(“%d”,&p); scanf(“%d”,*p);
C)scanf(“%d”,&n); D)p = &n ;
*p=n ; *p = m ;
4.已有变量定义和函数调用语句:int a=25;print_value(&a);下面函数的输出结果是 D 。
void print_value(int *x)
{ printf(“%d\n”,++*x); }
A)23 B)24 C)25 D)26
5.若有说明:int *p1, *p2,m=5,n;以下均是正确赋值语句的选项是
C 。
A)p1=&m; p2=&p1 ; B)p1=&m; p2=&n; *p1=*p2 ; C)p1=&m; p2=p1 ; D)p1=&m; *p1=*p2 ;
6.若有语句:int *p,a=4;和p=&a;下面均代表地址的一组选项是
D 。
A)a,p,*&a B)&*a,&a,*p C)*&p,*p,&a D)&a,&*p,p 7.下面判断正确的是 C 。
A)char *a=”china”; 等价于char *a; *a=”china” ;
B)char str[10]={“china”}; 等价于char str[10]; str[ ]={“china”;}
C)char *s=”china”; 等价于char *s; s=”china” ;
D)char c[4]=”abc”,d[4]=”abc”; 等价于char c[4]=d[4]=”abc” ;
8.下面程序段中,for循环的执行次数是 C 。
char *s=”\ta\018bc” ;
for ( ; *s!=’\0’ ; s++) printf(“*”) ;
A)9 B)7 C)6 D)5
9.下面能正确进行字符串赋值操作的是 C 。
A)char s[5]={“ABCDE”}; B)char s[5]={‘A’,’B’,’C’,’D’,’E’}; C)char *s ; s=”ABCDE” ; D)char *s; scanf(“%s”,s) ;
10.下面程序段的运行结果是 C 。
char *s=”abcde” ;
s+=2 ; printf(“%d”,s);
A)cde B)字符’c’C)字符’c’的地址D)不确定
11.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是 B 。
A)c=*p1+*p2 B)p2=c C)p1=p2 D)
c=*p1*(*p2)
12.设有程序段:char s[ ]=”china”; char *p ; p=s ;则下面叙述正确的是
D 。
A)s和p完全相同
B)数组s中的内容和指针变量p中的内容相等
C)s数组长度和p所指向的字符串长度相等
D)*p与s[0]相等
13.以下与库函数strcpy(char *p1,char *p2)功能不相等的程序段是
D 。
A)strcpy1(char *p1,char *p2)
{ while ((*p1++=*p2++)!=’\0’) ; }
B)strcpy2(char *p1,char *p2)
{ while ((*p1=*p2)!=’\0’) { p1++; p2++ } }
C)strcpy3(char *p1,char *p2)
{ while (*p1++=*p2++) ; }
,.
D)strcpy4(char *p1,char *p2)
{ while (*p2) *p1++=*p2++ ; }
14.下面程序段的运行结果是 C 。
char a[ ]=”language” , *p ;
p=a ;
while (*p!=’u’) { printf(“%c”,*p-32); p++ ; }
A)LANGUAGE B)language C)LANG D)langUAGE
16.以下与库函数strcmp(char *s,char *t)功能相等的程序段是
C 。
A)strcmp1(char *s,char *t)
{ for ( ; *s++=*t++; )
if (*s= =’\0’) return 0 ;
return (*s-*t) ;
}
B)strcmp2(char *s,char *t)
{ for ( ; *s++=*t++; )
if (!*s) return 0 ;
return (*s-*t) ;
}
C)strcmp3(char *s,char *t)
{ for ( ; *t= =*s; )
{ if (!*t) return 0 ; t++ ; s++ ; }
return (*s-*t) ;
}
D)strcmp4(char *s,char *t)
{ for ( ; *s==*t; s++, t++ )
if (!*s) return 0 ;
return (*t-*s) ;
}
17.以下说明不正确的是 D 。
A)char a[10]=”china” ; B)char a[10],*p=a; p=”china”; C)char *a; a=”china” ; D)char a[10],*p;
p=a=”china”;
18.设有说明语句:char a[]=”It is mine”;char *p=”It is mine”;则以下不正确的叙述是 D 。
A)a+1表示的是字符t的地址
B)p指向另外的字符串时,字符串的长度不受限制
C)p变量中存放的地址值可以改变
D)a中只能存放10个字符
19.若已定义char s[10];则在下面表达式中不表示s[1]的地址是
B 。
A)s+1 B)s++ C)&s[0]+1 D)&s[1] 20.若有定义:int a[5],*p=a;则对a数组元素的正确引用是 D 。A)*&a[5] B)a+2 C)*(p+5) D)*(a+2)
21.若有定义:int a[5],*p=a;则对a数组元素地址的正确引用是
D 。
A)p+5 B)*a+1 C)&a+1 D)&a[0]
22.若有定义:int a[2][3];则对a数组的第i行第j列元素值的正确引用是
A 。
A)*(*(a+i)+j) B)(a+i)[j] C)*(a+i+j) D)*(a+i)+j
23.若有定义:int a[2][3];则对a数组的第i行第j列元素地址的正确引用是
D 。
A)*(a[i]+j) B)(a+i) C)*(a+j) D)a[i]+j 24.若有程序段:int a[2][3],(*p)[3]; p=a;则对a数组元素地址的正确引用是。
A)*(p+2) B)p[2] C)p[1]+1 D)(p+1)+2
25.若有程序段:int a[2][3],(*p)[3]; p=a;则对a数组元素的正确引用是
C 。
A)(p+1)[0] B)*(*(p+2)+1) C)*(p[1]+1) D)p[1]+2
26.若有定义:int a[5];则a数组中首元素的地址可以表示为 C 。A)&a B)a+1 C)a D)&a[1]
27.若有定义:int (*p)[4];则标识符p C 。
A)是一个指向整型变量的指针
B)是一个指针数组名
C)是一个指针,它指向一个含有四个整型元素的一维数组
D)定义不合法
28.以下与int *q[5];等价的定义语句是 C 。
A)int q[5] B)int *q C)int *(q[5]) D)int (*q)[5]
29.以下正确的说明语句是 B 。
A)int *b[]={1,3,5,7,9} ;
B)int a[5],*num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};
C)int a[]={1,3,5,7,9}; int *num[5]={a[0],a[1],a[2],a[3],a[4]};
D)int a[3][4],(*num)[4]; num[1]=&a[1][3];
30.若有定义:int b[4][6],*p,*q[4];且0≤i<4,则不正确的赋值语句是
D 。
A)q[i]=b[i]; B)p=b; C)p=b[i]; D)q[i]=&b[0][0]
32.若要对a进行自减运算,则a应有下面说明 D 。
A)int p[3]; B)int k; C)char *a[3] D)int b[10];
int *a=p; int *a=&k;
int *a=b+1;
33.以下选项中,对指针变量p的正确操作是 B 。
A)int a[3], *p; B)int a[5], *p; C)int a[5]; D)int a[5]
p=&a; p=a; int *p=a=100; int *p1,*p2=a;
*p1=*p2;
34.若有定义:int x[10]={0,1,2,3,4,5,6,7,8,9},*p1;则数值不为3的表达式是
C 。
A)x[3] B)p1=x+3,*p1++
C)p1=x+2,*(p1++) D)p1=x+2,*++p1
35.下面程序段的输出是 C 。
int a[ ]={2,4,6,8,10,12,14,16,18,20,22,24},*q[4],k;
for (k=01; k<4; k++) q[k]=&a[k*3];
printf(“%d\n”,q[3][0]);
A)8 B)16 C)20 D)输出不合法
36.若要对a进行自增运算,则a应具有下面说明 D 。
A)int a[3][2]; B)char *a[ ]={“12”,”ab”};
C)char (*a) [3] D)int b[10], *a=b;
37.若有定义int a[4][6];则能正确表示a数组中任一元素a[i][j](i,j均在有效范围内)地址的表达式 A 。
A)&a[0][0]+6*i+j B)&a[0][0]+4*j+i
C)&a[0][0]+4*i+j D)&a[0][0]+6*j+I
38.下面程序的运行结果是 B 。
main ( )
{ int x[5]={2,4,6,8,10}, *p, **pp ;
p=x , pp = &p ;
printf(“%d”,*(p++));
printf(“%3d”,**pp);
}
A)4 4 B)2 4 C)2 2 D)4 6 39.若有定义int x[4][3]={1,2,3,4,5,6,7,8,9,10,11,12}; int (*p)[3]=x ; 则能够正确表示数组元素x[1][2]的表达式是 D 。
A)*((*p+1)[2]) B)(*p+1)+2
C)*(*(p+5)) D)*(*(p+1)+2)
40.若有说明:char
*language[]={“FORTRAN”,”BASIC”,”PASCAL”,”JA V A”,”C”};则language[2]
的值是 B 。
A)一个字符B)一个地址C)一个字符串D)一个不定值
41.设有定义:char *cc[2]={“1234”,”5678”};则正确的叙述是 A 。A)cc数组的两个元素中各自存放了字符串”1234”和”5678”的首地址
B)cc数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址
C)cc是指针变量,它指向含有两个数组元素的字符型一维数组
D)cc元素的值分别维”1234”和”5678”
42.已有定义int (*p)( );指针p可以 B 。
A)代表函数的返回值B)指向函数的入口地址
C)表示函数的类型D)表示函数返回值的类型
43.已有函数max(a,b),为了让函数指针变量p指向函数max,正确的赋值方法是 A 。
A)p=max; B)p=max(a,b); C)*p=max; D)
*p=max(a,b);
44.若有函数max(a,b),并且已使函数指针变量p指向函数max,当调用该函数时,正确的调用方法是 C 或p(a,b)。
A)(*p)max(a,b) B)*pmax(a,b); C)(*p)(a,b); D )*p(a,b);
45.以下正确的叙述是 C 。
A)C语言允许main函数带形参,且形参个数和形参名均可由用户指定
B)C语言允许main函数带形参,形参名只能是argc和argv
C)当main函数带有形参时,传给形参的值只能从命令行中得到D)若有说明: int main(int argc,char **argv),则argc的值必须大于1 三.程序阅读题
1.写出下面程序的运行结果。 5
func(char *s,char a,int n)
{ int j;
*s=a; j=n ;
while (*s
return j;
}
main ( )
{ char c[6] ;
int i ;
for (i=1; i<=5 ; i++) *(c+1)=’A’+i+1;
printf(“%d\n”,func(c,’E’,5));
}
2.写出下面程序的运行结果。 6
fun (char *s)
{ char *p=s;
while (*p) p++ ;
return (p-s) ;
}
main ( )
{ char *a=”abcdef” ;
printf(“%d\n”,fun(a)) ;
}
3.写出下面程序的运行结果。 abcdefglkjih
sub(char *a,int t1,int t2)
{ char ch;
while (t1 ,. ch = *(a+t1); *(a+t1)=*(a+t2) ; *(a+t2)=ch ; t1++ ; t2-- ; } } main ( ) { char s[12]; int i; for (i=0; i<12 ; i++) s[i]=’A’+i+32 ; sub(s,7,11); for (i=0; i<12 ; i++) printf (“%c”,s[i]); printf(“\n”); } 4.当运行以下程序时,写出输入 6↙的程序运行结果。 976531 sub(char *a,char b) { while (*(a++)!=’\0’) ; while (*(a-1) *(a--)=*(a-1); *(a--)=b; } main ( ) { char s[]=”97531”,c; c = getchar ( ) ; sub(s,c); puts(s) ; } 5.写出下面程序的运行结果。 Java dBase C Language Pascal main ( ) { char *a[]={“Pascal”,”C Language”,”dBase”,”Java”}; char (**p)[ ] ; int j ; p = a + 3 ; for (j=3; j>=0; j--) printf(“%s\n”,*(p--)) ; } 四.程序填空题 1.下面函数的功能是从输入的十个字符串中找出最长的那个串,请填(2)空使程序完整。 void fun(char str[10][81],char **sp) { int i; *sp = 【1 str[0] 】; for (i=1; i<10; i++) if (strlen (*sp) } 2.下面函数的功能是将一个整数字符串转换为一个整数,例如:”-1234”转换为1234,请填(3)空使程序完整。 int chnum(char *p) { int num=0,k,len,j ; len = strlen(p) ; for ( ; 【1 *p!=’\0’】; p++) { k=【2 *p-‘0’】; j=(--len) ; while (【3 j--!=0 】) k=k*10 ; num = num + k ; } return (num); } 3.下面函数的功能使统计子串substr在母串str中出现的次数,请填(3)空使程序完整。 int count(char *str, char *substr) { int i,j,k,num=0; for ( i=0; 【1 str[i]!=’\0’】; i++) for (【2 j=i 】, k=0; substr[k]= =str[j]; k++; j++) if (substr [【3 k 】]= =’\0’) { num++ ; break ; } return (num) ; } 6.下面函数的功能是将两个字符串s1和s2连接起来,请填(2)空使程序完整。 void conj(char *s1,char *s2) { while (*s1) 【1 s1++ 】; while (*s2) { *s1=【2 *s2 】; s1++,s2++; } *s1=’\0’ ; } 五.编程题 1.定义3个整数及整数指针,仅用指针方法按由小到大的顺序输出。 2.输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数:①输入10个数;②进行处理;③输出10个数。所有函数的参数均用指针。 3.编写一个求字符串的函数(参数用指针),在主函数中输入字符串,并输出其长度。 4.编写一个函数(参数用指针)将一个3×3矩阵转置。 5.写函数原型为int strcmp(char *s1,char *s2);的函数,该函数实现两个字符串的比较(函数功能描述参见教材P137,strcmp字符串处理函数)。 6.利用指向行的指针变量求5×3数组各行元素之和。 1、使用选择法、冒泡法对10个数进行排序,并输出排序前后的数列。 n k=0; m t=0; //用于记录出列顺序 while(t 25 36 78 13 12 26 88 93 75 18 22 32 56 44 36 58 然后执行以下操作: ①输出矩阵两个对角线上的数; ②分别输出各行和各列的和; ③交换第一行和第三行的位置; ④交换第二列和第四列的位置; ⑤输出处理后的数组。 #include<> #define SIZE 4 void main() { int a[SIZE][SIZE]={{25,36,78,13},{12,26,88,93},{75,18,22,32},{56,44,36,58}}; int i,j,t,sum; //输出二维数组 printf("二维数组:\n"); for(i=0;i 如何透彻理解C语言中指针的概念 强大的指针功能是C语言区别于众多高级语言的一个重要特征。C语言指针的功能强大,使用灵活多变,可以有效地表示复杂的数据结构、动态分配内存、高效地使用数组和字符串、使得调用函数时得到多个返回值。而它的应用远不限于此。初学者对于指针的概念总是感到无所适从,有时觉得“自己懂了,为什么编译器就是不懂呢”,常有茫然和无助的感觉。 学好指针的关键在于深入了解内存地址的空间可以理解为一个一维线性空间,内存的编址和寻址方法,以及指针在使用上的一些规定。事实上,指针就是方便我们对内存地址直接进行操作的,是为程序员服务的,我们只要抓住指针想要帮助我们解决什么问题这个核心,就可以轻松地理解它的工作原理。 什么是指针,指针有什么作用 指针就是指向一个特定内存地址的一个变量。简化了的内存空间模型是按照从0到某一个数(比如1048575=1M-1)的一维线性空间,其中的每一个数对应一个存储单元,即1个字节。指针有两个属性:指向性和偏移性。指向性指的是指针一定要有一个确定的指向,偏移性则是体现指针重要应用的方面,即指针可以按程序员的要求向前或向后偏移。 指针的应用往往与数组联系在一起,为了方便说明问题,不妨从数组开始解释指针的偏移。数组就是许多的变量,它的一个重要特征就是在内存空间中连续地存放,而且是按下标顺序存放。比如我们定义一个有100个变量的一维整型数组,它一定从内存的某一个存储单元开始按数组下标顺序存放,连续占用100*4=400字节。当我们定义一个数组时,系统就会自动为它分配一个指针,这个指针指向数组的首地址。(在本文剩余部分的论述中,不加区分地使用“指向数组的首地址”与“指向数组的第一个元素”这两种说法,事实上这两种说法也是一致的。) 为了让系统了解每一次指针偏移的单位,也为了方便程序员进行指针偏移(让程序员记住一个整形变量占用4字节,一个字符型变量占用1字节……等等是很麻烦的),不用每次去计算要偏移多少个字节,C语言引入了指针的基类型的概念。基类型的作用就是让系统了解某个指针每次偏移的字节数。比如,对于一个字符型指针,它每次偏移(比如ptr=ptr+1)所起到的作用就是让指针偏移1字节;而对于一个整型指针,它每次偏移就应该是4字节。这样操作数组时就带来了方便。比如对于一个指向某个整型数组起始存储单元(称为首地址)的指针ptr,ptr=ptr+1就表示将该指针指向这个数组的下一个元素的存储单元,即向后移动4字节,而不仅仅是移动一个存储单元(即移动1字节)。 &()、*()、和[ ]运算符的意义 在本文中,将&()、*()和[ ]都看成是运算符。这样可以方便理解这三个概念。简单地说,&()将某个标识符(比如变量)转化为其在内存空间中的地址,而*()是产生一个对应于某个地址的标识符,[ ]就更复杂一点,ptr[i]表示 一、单项选择题 1.(A)是构成C语言程序的基本单位。 A、函数 B、过程 C、子程序 D、子例程 2.C语言程序从C开始执行。 A) 程序中第一条可执行语句B) 程序中第一个函数 C) 程序中的main函数D) 包含文件中的第一个函数 3、以下说法中正确的是(C)。 A、C语言程序总是从第一个定义的函数开始执行 B、在C语言程序中,要调用的函数必须在main( )函数中定义 C、C语言程序总是从main( )函数开始执行 D、C语言程序中的main( )函数必须放在程序的开始部分 4.下列关于C语言的说法错误的是(B )。 A) C程序的工作过程是编辑、编译、连接、运行 B) C语言不区分大小写。 C) C程序的三种基本结构是顺序、选择、循环 D) C程序从main函数开始执行 5.下列正确的标识符是(C)。 A.-a1 B.a[i] C.a2_i D.int t 6.下列C语言用户标识符中合法的是(B)。 A)3ax B)x C)case D)-e2 E)union 7.下列四组选项中,正确的C语言标识符是(C)。 A)%x B)a+b C)a123 D)123 8、下列四组字符串中都可以用作C语言程序中的标识符的是(A)。 A、print _3d db8 aBc B、I\am one_half start$it 3pai C、str_1 Cpp pow while D、Pxq My->book line# His.age 9.C语言中的简单数据类型包括(D)。 A、整型、实型、逻辑型 B、整型、实型、逻辑型、字符型 C、整型、字符型、逻辑型 D、整型、实型、字符型 10.在C语言程序中,表达式5%2的结果是C。 A)2.5 B)2 C)1 D)3 11.如果int a=3,b=4;则条件表达式"a 数组练习解答 1定义一个名为 a 的单精度实型一维数组 ,长度为 4,所有元素的初值均为 0的数定义语句就是 【分析】按照一般数据定义语句的格式 ,可以直接写出方法一(参瞧答案);考虑到所有元素均赋初值时可 以省略数组长度,可以写出方法二(参瞧答案);考虑到不省略数组长度,给部分元素赋初值时,所有未赋初 值的元素均有空值(对数值型数组来说,初值为0),可以写出方法三(参瞧答案);考虑到选用静态型,不赋 初值所有元素也自动赋予。空值 (对数值型数组来说,初值为0),可以写出方法四(参瞧答案)。 【答案】方法一 :float a[4] = (0.0,0.0,0.0,0.0}; 方法二:float a[] = ( 0.0,0.0,0.0,0.0}; 规定,定义字符型数组时不允许直接使用 "字符常量"的方式赋初值,所以备选答案②也就是错误的。 备选答案③符合题意。【答案】③ 6定义一个名为"s"的字符型数组,并且赋初值为字符串"123"的错误语句就是() ① char s[]={ '1','2','3',' \0 '}; ② char s 「」={"123"}; ③ char s[]={"123\n"}; ④ char s[4]={'1','2','3'}; 【分析】备选答案①中省略了数组长度 ,所以每个元素都赋了初值,共计4个元素,初值依次为T '3'、’ \0',最后一个元素的值为字符串结束标记 ,所以数组S 中存放的就是字符串"123",该答案不符合 题意(即正确的);备选答案③中直接赋予字符串作为初值所以数组 s 的长度为4,其中的初值就是字符串 "123",不符合题意(即正确的);备选答案③中也就是给数组 s 赋予字符串的初值,但就是字符串不就是 方法三:float a[4]= {0.0}; 方法四:static float [4]; 2下列数组定义语句中,错误的就是() ① char x[1] = 'a'; ② auto char x[1]={0}; ③ static char x[l]; ④ char x[l]; 【分析】显然答案①中给字符型数组赋初值的格式不对 以 备选答案①就是符合题意的答案。 【答案】① 3用"冒泡排序法"对n 个数据排序,需要进行n 一 1 较,小者调上;该操作反复执行 n- k 次。现在假设有 则利用"冒泡排序法"执行第2步后的结果就是 【分析】开始排序前的排列执行第 4 1 - 3 : (不能直接赋予字符常量,必须用花括号括住),所 步。其中第k 步的任务就是:自下而上,相邻两数比 4个数据:4、l 、3、2要排序,假定4为上、2为下, O 1步后的排列执行第 2步后的排列 1 2 4 2 【答案】l 、2、4、 3 4用"选择排序法"对n 个数据排序,需要进行n-1 据中寻找最小数,与第k 个数据交换。现在假设有 行第2步后的结果就是 ____________________ 【分析】 开始排序前的排列为: 4 执行第1步后的排列为: 执行第2步后的排列为: 【答案】1、2、3、4 5下列数组定义语句中,正确的就是() ① int a[][]={1,2,3,4,5,6}; ② char a[2] ③ int a[][3]= {1,2,3,4,5,6}; ④ static int a[][] 【分析】C 语言规定,二维数组定义时不允许省略第二维的长度 步。其中第k 步的任务就是:在第k 个数据到第n 个数 4个数据:4、 1、 3、2要排序,则利用"冒泡排序法"执 「3] = 'a','b'; ={{1,2,3},{4,5,6}}; ,所以备选答案①④就是错误 C 语言还 显然 、'2'、 实验4 数组 一.实验目的: 1.掌握一维数组的定义、赋值和输入输出的方法; 2.掌握字符数组定义、初始化、赋值的方法; 3.了解常见的字符串函数功能及其使用方法; 4.掌握二维数组的定义与引用。 二.实验内容: 1.编写程序,输入10个整数存入一维数组,统计输出其中的正数、负数和零的个数。 2.编写程序,输入10个整数存入一维数组,再按逆序重新存放后再输出。 3.编写程序,输入10个整数存入一维数组,对其进行升序排序后输出。 4.编写程序,求二维数组中元素的最大值和最小值。 5.编写程序,求一个4×4矩阵中所有元素之和。 6.编写程序:从键盘上输入一字符串,统计输出该字符串中的字母字符、数字字符、空格以及其他字符的个数。 7.编写程序:从键盘上输入一字符串,并判断是否形成回文(即正序和逆序一样,如“abcd dcba”)。 8. 产生一个由10个元素组成的一维数组并输出,数组元素由随机数(0-99)构成。 9. 产生一个由10个元素组成的一维数组,数组元素由随机数(0-99)构成。按照升序排列并输出。再输入一个数,按原来的规律将其插入并输出。 页脚内容1 10. 产生一个由10个元素组成的一维数组,数组元素由随机数(0-99)构成。按照升序排列并输出。再输入一个数,要求找出该数是数组中的第几个元素,如果不在数组中,则输出找不到。 11. 找出一个二维数组中的鞍点,即该位置上的元素在该行最大,在该列最小。可能没有鞍点。 12. 编程输出杨辉三角。(要求输出10行)(杨辉三角:每行端点与结尾的数为1.每个数等于它上方两数之和。每行数字左右对称,由1开始逐渐变大) 13. 输入一行字符,统计大写字母、小写字母、数字、空格以及其它字符个数。 14. 编写程序,将两个字符串连接起来,不用strcat。 15. 编写程序实现strcpy函数功能。 16. 编程实现strlen函数功能。 17. 编程求2-4+6-8…-100+102的值。 18. 假设某人有100,000现金。每经过一次路口需要进行一次交费。交费规则为当他现金大于50,000时每次需要交5%如果现金小于等于50,000时每次交5,000。请写一程序计算此人可以经过多少次这个路口。 19. 输入若干个正整数,以0结束,将其中大于平均值且个位为5的数排序后输出。(按由大到小的顺序排序) 20. 输入一个字符串,将其中ASCII码值为基数的字符排序后输出。(按由小到大的顺序) 21. 输入一个以回车结束的字符串(少于80个字符),滤去所有的非16进制字符后,组成一个新字符串(16进制形式),然后将其转换为10进制数后输出。 22. 读入一个正整数n(1<=n<=6),再读入n阶矩阵,计算该矩阵除副对角线、最后一行、最后一列 页脚内容2 C语言中一个关于指针传递的问题 李云 UTStarcom通讯有限公司 E-Box Team 2005-06-22 摘要 指针在C语言中扮演着极为重要的角色,它的存在为C语言提供了极大的灵活性,当然,不少问题也是由指针所引起的(双刃剑)。本文通过分析一个由指针传递所引起的错误,从而使得我们更加重视指针在编程中的传递问题。 关键词 C语言指针传递 缩略语 Significant Byte 最低有效字节 Least LSB MCI Management & Control Interface 管理控制接口 Byte 最高有效字节 MSB Most Significant 1 问题的提出 指针因为灵活使得我们在编程时有意识的利用这一特性,从而使得我们的设计也更加的灵活,如函数指针等等。在很多情况下,我们需要从被调用函数返回结果。这可以通过两种方法来实现,一是通过函数的返回值,二是通过将指针作为参数传递给被调用函数。 图 1.1就是一个例子。 00001:S32 mci_module_id_from_name(S8* name, U16* module_id) 00002:{ 00003:mci_module_t *module; 00004:U16 index = 0; 00005: 00006:if(name == NULL || module_id == NULL) 00007:return ERR_MCI_INV_PRARAM; 00008: 00009:for(;index <= g_mci_last_module_id; index ++) 00010:{ 00011:module = g_mci_module_array[index]; 00012: 00013:if(module == NULL) 00014:continue; 00015: 00016:if(strcmp(module->name, name) == 0) 00017:{ 00018:*module_id = index; 6.1.1 Fibonacci数列 /* Fibonacci数列递推求解 */ main() {int k,n; long s,f[50]; printf("求数列的第n项与前n项和,请输入n:"); scanf("%d",&n); f[1]=1;f[2]=1;s=2; /* 数组元素与和变量赋初值 */ for(k=3;k<=n;k++) {f[k]=f[k-1]+f[k-2]; /* 实施递推 */ s+=f[k];} /* 实施求和 */ printf("F数列第%d项为:%ld\n",n,f[n]); printf("F数前%d项之和为:%ld\n",n,s); } 6.1.2 幂序列 /* 幂序列程序 */ main() {int k,n; long a,b,s,f[100]; printf("求数列的第n项与前n项和,请输入n:"); scanf("%d",&n); a=2;b=3;s=0; for(k=1;k<=n;k++) {if(a else {f[k]=b;b=b*3;} /* 用3的幂给f[k]赋值 */ s+=f[k];} printf("数列的第%d项为:%ld\n",n,f[n]); printf("数列的前%d项之和为:%ld\n",n,s); } 6.1.3 双关系递推数列 /* 双关系2x+1,3x+1递推 */ main() {int n,i,j,h,m[1500]; m[1]=1; scanf("%d",&n); for(i=1;i<=n;i++) {m[2*i]=2*m[i]+1;m[2*i+1]=3*m[i]+1; for(j=i+2;j<=2*i+1;j++) {if(m[i+1]>m[j]) /* m(i+1)与m(j)比较 */ {h=m[j]; m[j]=m[i+1];m[i+1]=h;} /* 交换,使m(i +1)最小 */ if(m[i+1]==m[j]) m[j]=20000+j;}} /* 置m(j)为一出界大数,以避免重复 */ for(i=1;i<=n;i++) {printf(" %4d",m[i]);C语言必背的典型程序设计题目 - 数组、函数-------参考答案
如何透彻理解C语言中指针的概念
C语言练习题(带答案)
c语言数组习题
C语言数组编程题
C语言中一个关于指针传递的问题
C语言数组例题
c语言数组例题