c语言常考的笔试题1

最近答了7次笔试题,稍有些心得,企业再面试c语言不会像过去的那种读程序题写结果或者简单的函数编写,再或者考你一些简单的逻辑,c的精华是内存和指针的运用,围绕这些我想写一些东西供自己总结和给同事们、同学们、学弟们参考。如下是常见到的笔试题,如果有笔试,前一天看一遍这些题结果不会让你失望的。

 

想说一说关于集中数据类型的sizeof问题,这题出现率40%

sizeof就是求在内存总占多少字节的问题,最基本的char 1字节 short 2字节int 4字节

任何的指针都是4字节    sizeof(数组名)=数组占的大小(这里必须注意虽然数组名可作为只想数组首地址的指针,但是sizeof(数组名)求得的不是指针的大小,而是数组大小)

还有就是sizeof(结构体)    sizeof(联合体)

举两个例子    struct stu {

                                                 Char a;

                                                        Int b;

                                      

                  Char c; 

}

struct teacher {

                                                 Char a;

Char c; 

                                                        Int b;

}

Sizeof (stu) =12  ;内存中这样存储  char空空空   int  char 空空空

内存4字节对其问题

Sizeof (teacher) =8  ;内存中这样存储  char char空空   int

关于联合体

Union std{

                                                 Char a[10]

                                                        Int b[3];

}

 

Sizeof(std)=12;   联合体公用内存,取其中所占内存最大的元素为联合体所占内存

以下为Windows NT下的32C++程序,请计算sizeof的值
       char  str[] = “Hello” ;
       char   *p = str ;
       int     n = 10;
1.
请计算
sizeof (str ) =   
sizeof ( p ) =   
sizeof ( n ) =  
void Func ( char str[100])
{
请计算
sizeof( str ) =   
}
void *p = malloc( 100 );
请计算
sizeof ( p ) =    

还有位段的问题如下

分析:

struct bit

{   int a:3;

    int  b:2;

    int c:3;

};

int main()

{

  bit s;

  char *c=(char*)&s;

   cout<<sizeof(bit)<<endl;

  *c=0x99;

   cout << s.a <<endl <<s.b<<endl<<s.c<<endl;

     int a=-1;

   printf("%x",a);

  return 0;

}

输出为什么是

4

1

-1

-4

ffffffff

因为0x99在内存中表示为100 11 001 , a = 001, b = 11, c = 100

c为有符合数时, c = 100, 最高1为表示c为负数,负数在计算机用补码表示,所以c = -4;同理

b = -1;

c为有符合数时, c = 100, c = 4,同理b = 3

 

 

位域  

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有01两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:    

struct位域结构名     

{位域列表 };   

其中位域列表的形式为:类型说明符 位域名:位域长度    

例如:    

struct bs   

{   

int a:8;   

int b:2;   

int c:6;   

};   

位域变量的说明与结构变量说明的方式相同。可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:    

struct bs   

{   

int a:8;   

int b:2;   

int c:6;   

}data;   

说明databs变量,共占两个字节。其中位域a8位,位域b2位,位域c6位。对于位域的定义尚有以下几点说明:  

 

1.一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:    

struct bs   

{   

unsigned a:4   

unsigned :0   

unsigned b:4   

unsigned c:4   

}   

在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。  

 

2.由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。  

 

3.位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:    

struct k   

{   

int a:1   

int :2   

int b:3   

int c:2   

};   

从以上分析可以看出,位域在本质上就是一种结构类型,不过其成员是按二进位分配的。  

 

位域的使用位域的使用和结构成员的使用相同,其一般形式为:位域变量名&#8226;位域名位域允许用各种格式输出。   

main(){   

struct bs   

{   

unsigned a:1;   

unsigned b:3;   

unsigned c:4;   

} bit,*pbit;   

bit.a=1;   

bit.b=7;   

bit.c=15;   

pri

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值