首页 > 代码库 > QN 笔试反思 HL笔试 反思

QN 笔试反思 HL笔试 反思

先写 HL的笔试题目

int a[4]; a++;是错的  因为  a代表了一个常量的地址。

百度解释:

对于一维数组,数组名代表的是数组的首地址,而且数组名是一个常量地址,也就是说数组名的地址是不可改变的。因此数组名是一个地址,对数组名使用加法运算,会使地址移到下一个位置。就你的例子而言,数组名a指向的是数组中第一个元素的地址,如果使用a+1,则使a指向了数组中第二个元素的地址,要访问地址中的元素,需要使用指针。而对于常量而言,是不能使用a++这样的语句的,也就是说不能使用诸如3++这样的语句。你要把数组的地址加1,需要使用a+1;

举个例子:
int a[]={1,2,3}
cout<<(a+1)[0]<<*(a+1)<<endl; 结果都输出2,因为这时a+1的地址是数组中第二个元素的地址。而*(a+1)表示的是访问这个地址中存储的值,(a+1)[0]与使用*(a+1)笑果是一样的

若定义了char ch[]={"abc\0def"},*p=ch;则执行printf("%c",*p+4);语句的输出结果是()
A def B d C e D 无确定值
为什么选择C?
注意,不是*(p+4),而是*p+4,是‘a‘的ascii码加4,就是‘e‘了

#include<stdio.h>
int main(){
struct{
int ss;//4
short a;//2
char b;//1
float c;//4  float 和 int  代表了  相同的 大小  应该是  结构体名称 还会占用一个大小  否则说不通了
}cs;
printf("%d\n%d\n%d\n%d\n%d\n",sizeof(cs),sizeof(cs.a),sizeof(cs.b),sizeof(cs.c),sizeof(cs.ss));
}

这题的关键在int *ptr=(int *)(&a+1);这一句上,&a表示取得数组a存储区域的首地址,再加1表示数组a存储区域的后的地址,这就使得ptr指针指向数组的最后一个元素后面的那个存储单元的地址,而ptr减1后,再进行数据访问,则访问的是ptr指针的前一个存储单元的值,所有最后的答案是2,5

好像  基本 没几题目是对的  ,妈蛋~~

#include <stdio.h>

int main(char *argv[], int *argc)
{
 int i=3;
 int j;
 
 j = sizeof(++i+ ++i);
 
 printf("i=%d j=%d", i ,j);//3 4
}
http://blog.sina.com.cn/s/blog_4762d6850100y1kl.html
上述程序,为什么打印出来的i=3呢, 我理解的是5 
在  sizeof  中的所有运算 都失效了。  而且表示的是int
解答::
根据C99规范, sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义, j = sizeof(++i+++i); 
在编译的时候被翻译成 j=sizeof((++i+++i的数据类型)) 也就是 j = sizeof(int);
也就是 j= 4; (32bit系统,如果是16位系统,则j=2) 然后才会继续编译成最终的程序,当然在最终程序执行的时候,自然不会执行任何++i了。
void f1(int *, int); 
void f2(int *, int); 
void(*p[2]) ( int *, int);

main()
{
int a;
int b;

p[0] = f1;
p[1] = f2;
a=3;
b=5;

p[0](&a , b);
printf("%d\t %d\t" , a ,b);

p[1](&a , b);
printf("%d\t %d\t" , a ,b);
}

void f1( int* p , int q)
{
int tmp;
tmp =*p;
*p = q;
q= tmp;
}

void f2( int* p , int q)
{
int tmp;
tmp =*p;
*p = q;
q= tmp;
 const  char i= 3;   常数  i  一定占用存储空间么??  母鸡
http://www.cnblogs.com/steararre/archive/2012/03/21/2410179.html
电平:      1     0
  TTL     输出 L: <0.8V ; H:>2.4V。 
输入 L: <1.2V ; H:>2.0V 
  CMOS  输出 L: <0.1*Vcc ; H:>0.9*Vcc。 
输入 L: <0.3*Vcc ; H:>0.7*Vcc. 
  RS232  逻辑1的电平为-3~-15V,逻辑0的电平为+3~+15V,注意电平的定义反相了一次。
数据队列   如何用C语言实现  从小到大排序。
这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

 

QN 笔试反思 HL笔试 反思