C语言经典面试题100道(附完整答案)
李肖遥
共 3230字,需浏览 7分钟
·
2022-04-18 00:05
来源:https://blog.csdn.net/qq_42613510/article/details/81225935
1.请填写bool , float, 指针变量 与“零值”比较的if语句。
提示:这里“零值”可以是0, 0.0 , FALSE 或者“空指针”。
例如int 变量 n 与“零值”比较的 if 语句为:
if ( n = =0 ) if ( n != 0 ) 以此类推。
(1)请写出bool flag 与“零值”比较的if 语句:
(2)请写出float x 与“零值”比较的if 语句:
(3)请写出char *p 与“零值”比较的if 语句:
2.以下为Linux下的32 位C 程序,请计算sizeof 的值。
char str[] = “Hello” ;
char *p = str ;
int n = 10;
请计算
(1)sizeof ( str ) =
(2)sizeof ( p ) =
(3)sizeof ( n ) =
(4)void Func ( char str[100])
{
…… ;
}
请计算sizeof( str ) =
(5)void *p=malloc(100);
sizeof( p )=
4.用变量a 给出下面的定义
e) 一个有10个指针的数组,该指针是指向一个整型数的;
f) 一个指向有10个整型数数组的指针;
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数;
h) 一个有10个指针的数组,每个指针指向一个函数,该函数有一个整型参数并返回一个整型数;
5. 设有以下说明和定义:
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)); 的执行结果是:_____
6.请问以下代码有什么问题:
int main()
{
char a;
char *str=& a;
strcpy(str,"hello");
printf(str);
return 0;
}
7.请问以下代码有什么问题:
char * s ="AAA";
printf("%s",s);
s[0]='B';
printf("%s",s);
有什么错?
8.int (*s[10])(int) 表示的是什么
9.c和c++ 中的struct有什么不同?
10.void getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,“hello world”);
}
int main( )
{
char *str=NULL;
getmemory(str);
printf(“%s/n”,str);
free(str);
return 0;
} 会出现什么问题?
11.char szstr[10];
strcpy(szstr,"0123456789");
产生什么结果?为什么?
12.数组和链表的区别?
13.void main()
{
char aa[10];
printf(“%d”,strlen(aa));
}
会出现什么问题?打印结果是是多少?
14.给定结构
struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
}; 问sizeof(A) = ?
15.struct name1
{
char str;
short x;
int num;
} ;求sizeof(name1)?
16.struct name2
{
char str;
int num;
short x;
}; 求sizeof(name2)?
17.程序哪里有错误
wap( int *p1,int *p2 )
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
19.(void *)ptr 和(*(void**))ptr 的结果是否相同?其中ptr为同一个指针。
20.要对绝对地址0x100000赋值,我们可以用
(unsigned int*)0x100000 = 1234;
那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?
27.关键字volatile有什么含意? 并给出三个不同的例子。
28.嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。
29.头文件中的ifndef/define/endif 干什么用?
30.#include 和 #include “filename.h” 有什么区别?
31.const 有什么用途?(请至少说明两种)
32.static有什么用途?(请至少说明两种)
33.堆栈溢出一般是由什么原因导致的?
34.如何引用一个已经定义过的全局变量?
35.全局变量可不可以定义在可被多个.C 文件包含的头文件中?为什么?
36.队列和栈有什么区别?
37.Heap与stack的差别。
38.用宏定义写出swap(x,y),即交换两数。
39.写一个“标准”宏,这个宏输入两个参数并返回较小的一个。
40.带参宏与带参函数的区别(至少说出5点)?
带参宏 带参函数
41.关键字volatile有什么含意?
42.int main()
{
int x=3;
printf("%d",x);
return 1;
}
问函数既然不会被其它函数调用,为什么要返回1?
43.已知一个数组table ,用一个宏定义,求出数据的元素个数。
44.A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?
这两个static变量会保存到哪里(栈还是堆或者其他的)?
45.static全局变量与普通的全局变量有什么区别?
46.static局部变量和普通局部变量有什么区别?
47.static函数与普通函数有什么区别?
48.程序的局部变量存在于()中,全局变量存在于 ()中,动态申请数据存在于()中。
49.什么是预编译,何时需要预编译?
50.用两个栈实现一个队列的功能?要求给出算法和思路!
51.对于一个频繁使用的短小函数,在C 语言中应用什么实现,在C++ 中应用什么实现?
52.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
53.Typedef 在C 语言中频繁用以声明一个已经存在的数据类型的同义字。
也可以用预处理器做类似的事。例如,思考一下下面的例子:
#define dPS struct s*
typedef struct s* tPS;
以上两种情况的意图都是要定义dPS 和tPS 作为一个指向结构s指针。
哪种方法更好呢?(如果有的话)为什么?
54.在 C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
56.语句for( ; 1 ;) 有什么问题?它是什么意思?
57.do……while和while……do有什么区别?
58.请写出下列代码的输出内容
#include
int main()
{
int a,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("b,c ,d:%d,%d,%d",b,c,d );
return 0;
}
59.unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
请问p1+5= ;
p2+5= ;
60.main()
{
int a[5]={1,2,3,4,5};
int * ptr=(int*)(&a+1);
printf(“%d,%d”,*(a+1),*(ptr-1));
}
请问输出:
61.请问下面程序有什么错误?
int a[60][250][1000],i,j,k;
for(k=0;k<=1000;k++)
for(j=0;j<250;j++)
for(i=0;i<60;i++)
a[i][j][k]=0;
62.以下是求一个数的平方的程序,请找出错误:
#define SQUARE(a)((a)*(a))
int a=5;
int b;
b=SQUARE(a++);
63.#define Max_CB 500
void LmiQueryCSmd(StructMSgCB * pmsg)
{
unsigned char ucCmdNum;
......
for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum++)
{
......;
}
} 这段代码执行有什么问题?
64.嵌入式系统中经常要用到无限循环,你怎么用C编写死循环。
67.
int x;
int modifyvalue()
{
return(x+=10);
}
int changevalue(int x)
{
return(x+=1);
}
void main()
{
int x =10;
x++;
changevalue(x);
x++;
modifyvalue();
printf("First output:%dn",x);
x++;
changevalue(x);
printf("Second output:%dn",x);
modifyvalue();
printf("Thirdoutput:%dn",x);
}输出?
68.不能做switch()的参数类型是:
69.请写出下列代码的输出内容
#include <stdio.h>
main()
{
int a,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("b,c ,d:%d,%d,%d",b,c,d );
return 0;
}
71.一语句实现x是否为2 的若干次幂的判断。
72.中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C 支持中断。具代表事实是,产生了一个新的关键字__interrupt 。下面的代码就使用了__interrupt 关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf(" Area = %f", area);
return area;
}
73.下面的代码输出是什么,为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b> 6)? puts("> 6") : puts("<= 6");
}
74.评价下面的代码片断:
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
/*1‘s complement of zero */
75.下面的代码片段的输出是什么,为什么?
char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
puts("Gota null pointer");
else
puts("Gota valid pointer");
76.编写strcpy 函数
已知strcpy 函数的原型是 char *strcpy(char *strDest, const char *strSrc);其中strDest是目的字符串,strSrc 是源字符串。
char *strcpy(char *strDest, const char *strSrc)
{
char *p=strDest;
assert(strDest!=NULL&&strSrc!=NULL);
while((*p++=*strSrc++)!='\0');
return strDest;
}
int binary_search(int* arr, int key, int n)
{
int low=0;
int high=n-1;
int mid;
while(low<=high)
{
mid=(low+high)/2;
if(key>arr[mid])
{
low=mid+1;
}
else if(key<arr[mid])
{
high=mid-1;
}
else
{
return mid;
}
}
return -1;
}
int sum(unsigned char byte)
{
int n=0;
for(int i=0;i<8;i++)
{
if(byte&1<<i)
n++;
}
return n;
}
int strtonum(char *str)
{
int num=0;
assert(str!=NULL);
while((*str)!='\0')
{
num=num*10;
num=num+(*str-48);
str++;
}
return num;
}
int numtostr(int n,char *s)
{
int len=0;
int oldn=n;
assert(s!=NULL);
while(n!=0)
{
n=n/10;
len++;
}
*(s+len)='\0';
for(;len>0;len--)
{
*(s+len-1)=oldn%10+'0';
oldn=oldn/10;
}
return 0;
}
int strcmp(const char *str1,const char *str2)
{ /*不可用while(*str1++==*str2++)来比较,当不相等时仍会执行一次++, return返回的比较值实际上是下一个字符。应将++放到循环体中进行。*/
while(*str1 == *str2)
{
assert((str1 != NULL) && (str2 != NULL));
if(*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
int AntitoneValue(char *father,char *child)
{
assert(father!=NULL);
char s[100];
int i,j;
while(father[j]) //放入source ,[j] 为长度
{
s[j] = father[j];
j++;
if(j > 99)
return -1;
}
s[j] = '\0';
for(i=0; i<j; i++)
child[i] = s[j-i-1]; // 反序
child[i] = '\0';
return 0;
}
int search(char *head,int n,char key)
{
assert(head!=NULL);
for(int i=0;i<n;i++)
{
if(*(head+i)==key)
return i;
}
return -1;
}
int linkringtest(list *head)
{
list *t1=head;
list *t2=head;
while(t1->next&&t2->next){
t1=t1->next;
if(t2=t2->next->next==NULL){
return 0;
}
if(t1==t2){
return 1;
}
}
return 0;
}
int lenofstr(char *s)
{
int len=0;
while(*s){
s++;
len++;
}
return len;
}
int main()
{
int i=10;
while_:
while(809*i!=800*i+9*i+1){
if(8*i>9&&8*i<100&&9*i>99&&9*i<1000){
i++;
}else{
printf("There is no satisfactory result!");
return -1;
}
if(i>99){
printf("There is no satisfactory result!");
return -1;
}
}
printf("%d is satisfied!\r",i);
if(i<100) goto while_;
return 0;
}
int encryption_num(int data)
{
int tmp[4];
int tmp_;
int i=0;
for(;i<4;i++){
tmp[i]=data%10;
tmp[i]=(tmp[i]+5)%10;
data=data/10;
}
tmp_=tmp[3]+tmp[2]*10+tmp[1]*100+tmp[0]*1000;
return tmp_;
}
int lookforstr(char *s1,char *s2)
{
int s11=0,s22=0;
int len=0,num=0;
if(s1==NULL||s2==NULL){
return -1;
}else{
while(*(s2+len)){
len++;
}
while(*s1){
while(*(s1+s11)==*(s2+s22)&&(*(s2+s22)!=0)){
s11++;
s22++;
}
if(len==s22){
num++;
}
s11=0;
s22=0;
s1++;
}
}
return num;
}
更新
void Reverse(char **str,int len)
{
char c = 0;
for(int i=0;i<len/2;++i)
{
c = (*str)[i];
(*str)[i] = (*str)[len-1-i];
(*str)[len-1-i] = c;
}
}
‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
关注我的微信公众号,回复“加群”按规则加入技术交流群。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。
评论