C语言面试题

25 篇文章 0 订阅
22 篇文章 1 订阅

1. 

请问这种定义结构体正确吗?如果有问题,问题在哪儿。

struct a {
    int x;
    char y;
    struct a z;
    struct a *p;
}

答:错误有两点。1.不能在结构体声明中定义结构体变量(struct a z);2.}后面没有加分号(;).以下为正确做法。

struct a {
    int x;
    char y;
    struct a *p;
}z;

2.#include <stdio.h>
int main()
{
  int a;
  int *p;
  p=&a;
  *p=0x500;
  a=(int)(*(&p));
  a=(int)(&(*p));
  if(a==(int )p)
   printf("equal !\n");
 else
printf("no equal !\n");
}

请问程序输出的值为多少

a,在32位的编译环境VC++6.0下测试

#include <stdio.h>
int main()
{
int a;
int *p;
p=&a;
*p=0x500;


printf("p=%llx\n",p);
printf("a=%llx\n",a);

printf("sizeof(p)=%d\n",sizeof(p));
printf("sizeof(a)=%d\n",sizeof(a));

a=(int)(*(&p));
printf("(int)(*(&p))=%llx\n",(int)(*(&p)));
printf("sizeof((int)(*(&p)))=%llx\n",sizeof((int)(*(&p))));
printf("a=%llx\n",a);

a=(int)(&(*p));
printf("(int)(&(*p))=%llx\n",(int)(&(*p)));
printf("sizeof((int)(&(*p)))=%llx\n",sizeof((int)(&(*p))));
printf("a=%llx\n",a);

printf("(int)(p)=%llx\n",(int)(p));

if(a==(int)p)
{
printf("equal !\n");
}
else
{
printf("no equal !\n");

}
}

结果:equal !

b,在64位编译器下测试,同样的代码会报错error: cast from ‘int*’ to ‘int’ loses precision [-fpermissive] 

分析,64位系统下指针P(sizeof(int*))是8位,而int是4位的,8位转4位会丢失精度,报错。

 

 

3.请写出下列代码的输出结果;

#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;
}

结果:b , c , d:10 , 12 , 120 

分析:b=a++;把a的值赋给b后a+1,此时b=10,a=11。

           c=++a;a的值先加1,再把a的值赋给c,此时c=12,a=12;

           d=10*a++;a的值乘以10赋给d,再把a的值加1;此时d=120,a=13;

4.队和栈的区别:

a、队列先进先出,栈先进后出。

b、对插入和删除操作的"限定"不同。

栈是限定只能在表的一端进行插入和删除操作的线性表。     

队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。  

b、遍历数据速度不同。

栈只能从头部取数据,也就最先放入的需要遍历整个栈最后才能取出来,而且在遍历数据的时候还得为数据开辟临时空间,保持数据在遍历前的一致性。

队列则不同,它基于地址指针进行遍历,而且可以从头或尾部开始遍历,但不能同时遍历,无需开辟临时空间,因为在遍历的过程中不影像数据结构,速度要快的多

5.TCP/IP通信建立的过程怎样,端口有什么作用

答:三次握手

A—>B SYN:我的初始序号是X,ACK是0,设置SYN位,未设置ACK位。

B—>A ACK:你的序号是X+1,我的序号是Y,设置SYN位和ACK位。

A—>B ACK:你的序号Y+1,我的序号X+1,设置ACK位,未设置SYN位;

端口确定是那个应用程序使用该协议。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值