Linux-C复习题

本文提供了C语言复习题及解答,包括选择题和简答题,覆盖了逗号表达式、循环结构、数组处理、字符串操作等内容,同时涉及局部变量与全局变量的作用域、存储方式及其区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

嵌云Linux-C复习题

一、选择题 

1. 逗号表达式 “(a=3*5,a*4),a+15”的值是  C  。

A. 15

B. 60

C. 30

D. 不确定

 

2. 下列程序的运行结果是:  C  。

int main(void)

{

int y=-5;

while (y++);

printf(“y=%d\n”,y);

return 0;

}

A. y=0

B. y= -1

C. y=1

D. while构成无限循环

 

3. 以下程序的输出结果是  B  。

int main(void)

int a[3][3]={{1,2,3},{4,5,6},{7,8,9}},i,j,s=0;

for(i=1;i<3;i++)

for(j=0;j<i;j++) s+=a[j];

printf (“%d\n”,s);

return 0;

}

A. 18

B. 19

C. 20

D. 21

 

4. 有下面的程序段

char a[3],b[]=”china”;

a=b;

printf(“%s”,a);

则  D  。

A. 运行后将输出china

B. 运行后将输出ch

C. 运行后将输出chi

D. 编译出错

 

5. 在C语言中,以下说法正确的是:  A  。

A. 普通实参和与其对应的形参各占用独立的存储单元

B. 实参和与其对应的形参共占用一个存储单元

C. 只有当实参和与其对应的形参同名时才共占用存储单元

D. 形参在函数调用前它就占用存储单元

 

6. 以下叙述中不正确的是_ D__。

A. 在不同的函数中可以使用相同名字的变量

B. 函数中的形式参数是局部变量

C. 在一个函数内定义的变量只在本函数范围内有效

D. 在一个函数内的复合语句中定义的变量在本函数范围内有效

 

7. 以下程序的输出结果是  A  。

int main(void)

{

int a=10;

int *p=&a;

*p=100;

printf(“a=%d”,*p+1);

return 0;

}

A. 101

B. 11

C. 段错误

D. 随机值

 

8. 以下程序的输出结果是  C  。

int main(void)

 

{

int a=10;

int *p;

*p=a;

printf(“a=%d”,*p+1);

return 0;

}

A. 101

B. 11

C. 段错误

D. 随机值

 

9. 以下程序运行后的输出结果是  A  。

int main(void)

{

char s[ ]=”9876″,*p;

for ( p=s ; p<s+2 ;p++)

printf(“%s “, p);

return 0;

}

A. 9876 876

B. 876 76

C. 876 876

D. 段错误

 

10. 下列关于C语言的叙述错误的是  A  。

A. 大写字母和小写字母的意义相同

B. 不同类型的变量可以在一个表达式中

C. 在赋值表达式中等号(=)左边的变量和右边的值可以是不同类型

D. 同一个运算符号在不同的场合可以有不同的含义

 

11. 设x、y、t均为int型变量,则执行语句:x=y=3;t=++x||++y;后,y的值为  B  。

A. 不定值

B. 4

C. 3

D. 1

 

12. 设 int x=1, y= 1; 表达式(!x||y--)的值是  B  。

A. 0

B. 1

C. 2

D. -1

 

13. 以下不能正确定义二维数组的是  D  。

A. int a[2][3];

B. int a[2][3]={1,2,3,4,5,6};

C. int a[ ][3]={1,2,3};

D. int a[2][3]={{1},{2},{3,4}};

 

14. 把字串b连接到字串a后面,应当使用  C  。

A. strcpy(a,b);

B. strcpy(b,a);

C. strcat(a,b);

D. strcat(b,a);

 

15.如果使用一个宏tri(x+y+z)来表示算式(x+y+z)*(x+y+z)*(x+y+z),则应如何定义 C 。

A. #define tri(x) x*x*x

B. #define tri(x) (x*x*x)

C. #define tri(x) (x)*(x)*(x)

D. #define tri(x) (x+y+z)*(x+y+z)*(x+y+z)

 

16. 以下程序的输出结果为  A  。

int main(void)

{

void sub (int *, int *);

int x=100, y=200;

sub (&x, &y);

printf(“ %d , %d \n ” , x , y);

return 0;

 

}

void sub( int *px , int *py)

*px=10; 

*py=20;

}

A. 10,20

B. 20,10

C. 100,200

D. 200,100

二、简答题

1、局部变量能否和全局变量重名?

答:能,局部会屏蔽全局。局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

 

2、如何引用一个已经定义过的全局变量?

答:extern。可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

 

3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

答:可以,在不同的C文件中以static形式来声明同名全局变量。

可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。

 

4、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?

答: 1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。

这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。

而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,

在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。

2) 从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

3)static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件

综上所述:

static全局变量与普通的全局变量有什么区别:

static全局变量只初使化一次,防止在其他文件单元中被引用;

static局部变量和普通局部变量有什么区别:

static局部变量只被初始化一次,下一次依据上一次结果值;

static函数与普通函数有什么区别:

static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

 

5、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区)中,动态申请数据存在于(堆)中。

 

6、设有以下说明和定义:

typedef union

{

long i;

int k[5];

char c;

} DATE;

struct data

{

int cat;

DATE cow;

double dog;

} too;

DATE max;

则语句 printf("%d",sizeof(struct data)+sizeof(max));的执行结果是:_52_

考点:区别struct与union.(一般假定在32位机器上)

答:DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字节. 所以它的大小是20. data是一个struct,每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32. 所以结果是 20 + 32 = 52.当然...在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 20。

 

/*

*以上6题为华为面试题

*/

 

7. 下述三个有什么区别?

char * const p;

char const * p

const char *p

解答:

char * const p; //常量指针,p的值不可以修改

char const * p;//指向常量的指针,指向的常量值不可以改

const char *p; //和char const *p

 

8. 指出下面代码的输出,并解释为什么。(不错,对地址掌握的深入挖潜)

main()

{

int a[5]={1,2,3,4,5};

int *ptr=(int *)(&a+1);

printf("%d,%d",*(a+1),*(ptr-1));

}

输出:2,5

*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5

&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)

int *ptr=(int *)(&a+1);

则ptr实际是&(a[5]),也就是a+5。

 

9、写一个“标准”宏,这个宏输入两个参数并返回较小的一个。

答:#define Min(X, Y) ((X)>(Y)?(Y):(X)) 

 

10、嵌入式系统中经常要用到无限循环,你怎么用C编写死循环。

答:while(1){}或者for(;;)。

 

11、关键字const有什么含意?

答 :1)表示常量不可以修改的变量。

2)可以修饰参数,作为输入参数.

3)修饰函数,防止以外的改动.

4)修饰类的成员函数,不改变类中的数据成员。

 

12. int (*s[10])(int) 表示的是什么啊

int (*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。

 

13.交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;

答:有两种解法, 一种用算术算法, 一种用^(异或)

a = a + b;

b = a - b;

a = a - b;

or

a = a^b;// 只能对int,char..

b = a^b;

a = a^b;

or

a ^= b ^= a;

 

14. const的理解:const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。事实上这个概念谁都有只是三种声明方式非常相似很容易记混。 Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:

把一个声明从右向左读。

char * const cp; ( * 读成 pointer to )

cp is a const pointer to char

const char * p;

p is a pointer to const char;

char const * p;

同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。

 

15. c指针

int *p[n];-----指针数组,每个元素均为指向整型数据的指针。

int (*p)[n];------p为指向一维数组的指针,这个一维数组有n个整型数据。

int *p();----------函数带回指针,指针指向返回的值。

int (*p)();------p为指向函数的指针。

 

16. 用变量 a 给出下面的定义 

a) 一个整型数(An integer)  

b) 一个指向整型数的指针(A pointer to an integer)  

c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an 

integer)  

d) 一个有 10 个整型数的数组(An array of 10 integers)  

e) 一个有 10 个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to 

integers)  

f) 一个指向有 10 个整型数数组的指针(A pointer to an array of 10 integers)  

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function 

that takes an integer as an argument and returns an integer)  

h) 一个有 10 个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型

数( An array of ten pointers to functions that take an integer argument and return an integer ) 

 

答案是:  

a) int a; // An integer  

b) int *a; // A pointer to an integer  

c) int **a; // A pointer to a pointer to an integer  

d) int a[10]; // An array of 10 integers  

e) int *a[10]; // An array of 10 pointers to integers  

f) int (*a)[10]; // A pointer to an array of 10 integers  

g) int (*a)(int); // A pointer to a function a that takes an integer argument and 

returns an integer  

h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer 

argument and return an integer  

 

17. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量 a,写两段代码,

第一个设置 a 的 bit 3,第二个清除 a 的 bit 3。在以上两个操作中,要保持其它位不变。

答:

#define BIT3 (0x1<<3)  

static int a;  

void set_bit3(void)  

{  

a |= BIT3;  

}  

void clear_bit3(void)  

{  

a &= ~BIT3;  

}  

 

18. 将1–1000中所有21的倍数存到一个一维数组中,并输出该数组的所有数据,同时在/opt目录下创建文件来保存之。


#include <stdio.h>


int main(void)
{
        FILE *fp;
        int i,a[1000],j=0;


        for(i = 1;i<1000;i++)
        {
                if(i%21 == 0)
                        a[j++] = i;


        }


        fp = fopen("/opt/1.txt","r+");


        for(i = 0;i < j;i++)
                fprintf(fp,"%d ",a[i]);
        fclose(fp);
        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值