主题作业三:函数与结构
数组变量名也是指针
一.单选题 访问结构指针所指向的结构的成员变量时用->, 访问结构的成1. 针对如下定义,合法的表达式是__C___。 员变量时用.
struct node { 成员s是数组,不能直接赋值(但是初始化数组的时候可以,例
char s[10]; 如char s[10]=”abc”; 那是由编译器在编译阶段完成的) int k; } p[5]; A.p.k=2 B.p[0]->k=2 C.(p->s)[0]=‘a’ D. p[0].s=“a” 2. 针对如下定义:
p指向a[1];然后p+1指向a[2],即元素9的位置;
static struct {
然后(int*)(p+1)则是将指针强制转换为一个整数指针,
int x, y[3];
位置不动,还是9的位置;
} a[3] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}, *p;
+2操作则把上面的整数指针向后移动2个,即指向11
p = a+1;
的位置;
表达式*((int *)(p+1)+2)的值为__D___。 A.3 B.7 C.10 D. 11 3. 对于以下结构定义,++p->str中的++加在__A___。
struct { char *str; int len;
->的优先级高于++,该表达式等价于++(p->str) 所以,++作用于p的成员变量str上。 执行后的结果是:指针p不变,但是它指向的结构的成员str加1
} *p;
A、指针str上 B、指针p上 C、str指的内容上 D、以上均不是
4. 根据声明int (*p)[10], p是一个__A___。 A.指针 B.数组 C.函数 D.数组元素 5. 若下面程序中所有的变量均已声明或定义,则下列选项中的变量能够在fun()中使用的是__A___。 第4题解答:注意:int (*p)[10] 和 int *p[10]是完全不一样的 #include
A.x, y B.x, y, z C. a,b,y,z D.a,b,x,y,z
二. 填空题
6. 对于下面的定义,(s[0].b)/(++p)->a的值为__0___。
s[0] 为{2,4},s[1] 为{6,8}。
s[0].b为4 struct {
p初始指向s[0],++p指向s[1],故(++p)->a的值为6 int a;
因为4/6为0,所以。。。。 int b;
} s[2]={2,4,6,8}, *p=s;
7. 下列程序段执行后,z的值是 _8_。 结构数组a[3]在内存中也可以看做是一个长度为12的整
static struct { 数数组:1,2,3,…, 11,12。
int x, y[3]; p的初始地址为a+3,那么p-1指向a[2],即元素9的位置 } a[3] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}, *p=a+3; (int*)将p-1强制转换为一个整型指针,但是还是指向9int z; 的位置。所以-1作用在整型指针(int*)(p-1)上,得到9的 z=*((int *)(p-1)-1); 前面一个整数元素的地址,即8的地址。 8. 下列代码段将会打印出__COND___。
char *c[3]={“FIRST”, “SECOND”, “THIRD”}; c是一个指针数组,c[0]指向字符串”FIRST”,c[1]指向字符printf(“%s”, *(c+1)+2); 串“SECOND”,c[2]指向字符床“THIRD”。 9. 下列程序段的输出结果是_fgh____。 *(c+1)为c[1],所以i*(c+1)+2指向字符SECOND中的C. 参考第8
char *st[ ]={\ 题的解释
printf(\参考第8题的解释。*(st+2)等价于st[2]。 10. 下列代码段的输出为_FOUR, P____。 因为*优先级高于+,所以**st+1等价于st[0][0]+1即,’O’+1,
char *st[ ]={\即’P’ printf(\
P指向a+1,所以*p为a[1]。**p为a[1]所指向的字符串的第一个11. 下列代码段的输出__45,3___。
字符,即’4’。所以**p-1为’3’ char *a[]={“678”,”45”},**p=a+1;
printf(“%s,%c”,*p,**p-1);
a[0]指向第0行。a[1]指向第1行,即元素3的位置。
12. 对于数组a,*(a[1]+1)的值为__4___。
那么a[1]+1指向元素3的后面的一个位置,即4的位置。
int a[3][2]={1,2,3,4,5,6};
13. 对于以下递归函数f,调用 f (3) 的返回值是__-17___。 f (int n)
{ return ((n>0) ? 2*f(n-1)+f(n-2) : -1); }
f(-1) f(0) f(1) f(2) f(3) -1 -1 -3 -7 -17
14. 下列代码段将会打印出__4___。 初始化:k为0, int i; 调用f(2):k从0变到1,函数返回2+0=2 int f(int x) 调用f(3):k从1变到2,函数返回3+1=4 { static int k = 0; x+=k++; return x; } i=f(2); i=f(3); printf(“%d”,i);
15. 下列代码段将会打印出___18__。 f(0) f(1) f(2) f(3) int f(int x) 3 3 6 18 { return ((x>0)? x*f(x-1):3); } f(f(1)) = f(3) = 18 printf(“%d”,f(f(1)));
16. 用 typedef 写出类型定义 typedef int * AIP[10]; ,使得AIP表示含有10个元素
的整型指针数组类型。 typedef TOld TNew[10]; 定义了一个新的类型,名称为TNew,它是一个长度为10的数组,其中每一个元素类型为Told。对于该题,Told为int*,TNew为AIP。 个新的类型的指针。该语句等价于: typedef TOld TNew[10]; typedef TNew* PNew; 而typedef TOld (*PNew)[10]; 则定义了一17. 假定可执行程序文件名字为prog,则运行命令:prog hello world后的输出为_____。
#include
输出为:prog#world#
int main(int argc, char *argv[]) {
printf(\
argc为3,
return 0;
argv[0],[1],[2]分别为“prog”, “hello”和”world”
}
18. 下列程序段的输出是___-3_______。
展开宏FB(k+1,k-1)后得到: #define FB(a,b) (a*b+1)
(k+1*k-1+1) int k=3;
所以该语句为:k=(k+1*k-1+1)-9 = -3 k= FB(k+1,k-1)-9;
printf(\
三、 阅读理解题
19. 下列程序的输出为_6#18#____。 a[3][3]的元素排列为: #include
s += a[0][i] s+= *(*a+i); 所以第一个for循环后,s为1+2+3=6 printf(\ **(a+i)等价于*a[i]等价于a[i][0]; for(i=0; i<3; i++) 所以第二个for循环后,s为6+1+4+7=18
s += a[i][0] s+= **(a+i); printf(\ }
20. 下列程序的输出是__5___。 f(0) f(1) f(2) f(3) f(4) f(5)
int f (int x) 1 1 2 3 5 7 {
if(x<=1) return 1;
else return f(x-1)+f(x-2); main() main() } k=1 j=3 void main( ) af(1); 输出3 { printf(\}
21. 下列程序的输出是__3#3#3#3___。
af(1) af(1) #include
j=2 j=3 int main (void)
af(2); 输出3#。返回3 { int k = 1; int a_function ( int j ); k = a_function ( k ); af(2) af(2) printf ( \j=3 j=3 } af(3); 输出3#。返回3 int a_function ( int j ) { if ( j < 3 ) { af(3) 输出 3#,返回3 22.
j++; j = a_function ( j ); } printf ( \ return ( j ); }
下列程序的输出为__a = 1, b = 4 ___。 #include
void melon (int g, int * h); int main (void) { int a = 1, b = 2; melon(a, &b)执行后,a的值不变, melon ( a, &b ); b的值增加了a+1,即b变为4。 printf ( \ a, b ); }
void melon (int b, int * c) { b++;
*c = *c + b; }
23. 下列程序的输出为_225____。
#include
Prime(n) 判断n是否为素数,是返回1,否
int i,m;
则返回0
if(n==1) return 0; m=sqrt(n);
for(i=2;i<=m;i++) if(n%i==0) break; return i>m; }
void main() { int num,i;
计算并输出num所有的素数因子
num=20;
num =20, i=2, print 2
for(i=2;i<=num;i++){
num =10,i=2, print 2
while(prime(i)&&(num%i==0)){
num =5,i=2 跳出while
printf(\
num =5,i=3,
num/=i;
num =5,i=4,
}
num =5,i=5,print 5
}
num =1,i=5,跳出循环
}
24. 下列程序的输出为__1,2___。 #include
函数f里交换指针, void f(int *x,int *y)
{ int *p; 但是交换的结果并不能返回给调用者, p=x; x=y; y=p; 也就是说,在调用者看来,都是无用功,等于啥
也没做。
}
void main() { int x=1, y=2; f(&y, &x);
printf(\
}
25. 若输入this is a test.
#include
int change(char *c,int status); void main() {
int flag=TRUE;
char ch;
do{
ch=getchar();
flag=change(&ch,flag); putchar(ch);
} while(ch!=’.’); printf(“\\n”); }
int change(char *c,int status) Status的意义是:是否要求变成大写字母 {
if(*c==’ ‘) return TRUE;
if(status&&*c<=’z’&&*c>=’a’) *c+=’A’-‘a’; 碰到空格了,后面的第一个字符要求大写
也就是单词的第一个字母大写 return FALSE;
}
26. 下列程序的输出为__5#0#___。
# include
int f(int m)
{
static int k=0; 执行f(4)时,m=4。执行后,static int k变成了k=5,函数返回5。
int s=0; 所以main中s=5。 for(; k<=m; k++) s++; 再执行f(2)时, m=2,k=5,所以f返回0。 return s; 所以输出为5#0#
}
void main( ) {
int s=1; s=f(4);
printf(\
}
27. 下列程序的输出为_-1#-1#-2#____。
#include