2-28 3-1面试续

1.关于static的用法

static有面向过程和面向对象两种用法

1.面向对象主要用于定于全局变量和局部变量和函数

全局和局部变量默认值都是0,全局变量的作用域在声明他的那个文件中其他文件不能访问,局部变量生命周期超出函数范围了,但他的作用域还是在函数中,出了函数是不能访问的,定义的函数也是在声明他的那个文件中。

2.面向对象的static主要用于定义static变量和函数

非static函数能够访问static变量,而static函数只能访问static函数和static变量,不能访问非static变量

参照http://wenku.baidu.com/view/b75e9b8e84868762caaed52b.html


3.int**p

这是个二级指针,p存放的是地址赋int **ptr 与 int ptr[4][4] 的区别、

区别在于:int **ptr定义了一个指针(具体的,二级指针),它使得编译程序使程序在运行时分配一点点内存用来存放这个指针——某个数值,它标明了内存中的某个位置; 而int ptr[4][4]定义了一个二维数组,它使得编译程序让程序在运行时在内存中分配sizeof(int)*4*4个字节用来存放数据。int **ptr中定义的ptr是一个变量,如果需要,你可以随时变换它的值——它也仅仅是一个值;而int ptr[4][4]中定义的ptr本身是一个常量.这个常量用来使编译器明白你所引用的是那个你已经为其分配过内存的数组,ptr这个引用的有效性依赖于 编译器,编译器会直接把它替换成某个常量——在运行时,根本没有任何内存空间来把这个值当作变量存放,它存在于代码中,是在连接时已经指定好的,一般的, 程序本身没有权利再去改变它。

4.下面这题两家公司都考到了,我做的时候我也是晕的

#include<iostream>
void GetMemory(char *p, int num)
{        
     p = (char*)malloc(sizeof(char)*num);
}
int main(){       
     char *str = NULL ;       
     GetMemory(str, 100) ;       
     strcpy(str, "hello") ;       
     return 0 ;
}
我以为这个是正确的,我想到这个指针就是地址,然后传给p,不就分配内存了吗?那如果是正确的考还有什么意思呢?面试宝典上面有这题
其实刚开始将str的值传给p但中途分配了新的内存,p指向了新的内存,而str还是不变的,我当时是吧GetMemroy的第一个参数改写成了char *&p,我感觉这样是可以的。
面试宝典是将第一个参数定义成了char **p,调用是GetMemory(&str) ;或者将p作为返回值,str = GetMemory(str, 100) ;我感觉这两种方法是可以的,我感觉直接定义个引用也是可以的。
5.c语言如何读取一个文件的函数
int main()
{
    FILE *fp ;
    fp = fopen("*.txt", "at+") ;
    if (NULL == fp)
         exit(0) ;
    ......
    fclose(fp) ;
    return 0 ;
}
深层的我不会
6.了解union以及cpu的大端和小端//参照http://wenku.baidu.com/view/abdc826227d3240c8447efb4.html
1.
1.大端模式...1
2.小端模式...1
3.为什么有大小端模式之分...1
4.测试编辑器属哪种模式...1
5.使用C语言判断处理器的大小端...2
6.大端模式和小端模式...3
 
1.大端模式
  所谓的大端模式,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
  例子: 
  0000430:e684 6c4e 0100 1800 53ef 0100 0100 0000 
  0000440:b484 6c4e 004e ed00 0000 0000 0100 0000 
  在大端模式下,前16位应该这样读:e684 
  记忆方法: 地址的增长顺序与值的增长顺序相反 
2.小端模式
  所谓的小端模式,是指数据的低位保存在内存的低地址中,而数 据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
  例子: 
  0000430:e684 6c4e 0100 1800 53ef 0100 0100 0000 
  0000440:b484 6c4e 004e ed00 0000 0000 0100 0000 
  在小端模式下,前16位应该这样读:84e6 
  记忆方法: 地址的增长顺序与值的增长顺序相同 
3.为什么有大小端模式之分
  为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于 大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEILC51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
4.测试编辑器属哪种模式
  下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:shortint x; 
  charx0,x1; 
  x=0x1122;
  x0=((char*)&x)[0];//低地址单元 
  x1=((char*)&x)[1];//高地址单元 
  若x0=0x11,则是大端; 若x0=0x22,则是小端......
  上面的程序还可以看出,数据寻址时,用的是低位字节的地址。 
linux操作系统中对大小端的判断:  
        static union { char c[4]; unsignedlong l; } endian_test = { { 'l', '?', '?', 'b' } };
  #defineENDIANNESS ((char)endian_test.l) 
  (如果ENDIANNESS=’l’表示系统为littleendian,为’b’表示big endian )。 
5.使用C语言判断处理器的大小端
  [1]int checkCPU()
  { 
  { 
  unionw 
  { 
  inta; 
  charb; 
  } c;
  c.a= 1; 
  return(c.b == 1); 
  } 
  } 
  2011年8月27日17:38:15添加 
  测试大小端l 
  #include<stdio.h>
  intmain(void) 
  { 
  inta= 0x12345678; 
  unsignedchar*p=(unsigned char *)&a; 
  if(0x78==*p)
  { 
  printf("littleend\n");
  } 
  else
  { 
  printf("bigend\n");
  } 
  return0;
  } 
  运行环境:Linuxroot-desktop 2.6.32-24-generic #39-Ubuntu SMPWed Jul 28 06:07:29 UTC 2010 i686 GNU/Linux
 6.大端模式和小端模式
有时候,用C语言写程序时需要知道是大端模式还是小端模式。 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEILC51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
 下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:
 short int x;
char x0,x1;
x=0x1122; 
x0=((char*)&x)[0];  //低地址单元
x1=((char*)&x)[1];  //高地址单元
若x0=0x11,则是大端; 若x0=0x22,则是小端......

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值