面试题目——基础篇

来源:互联网 发布:java基础教程 pdf下载 编辑:程序博客网 时间:2024/06/03 14:45

1.进程和线程


2.定义与声明
声明:告诉编译器,这个名字已经匹配到一块内存上了,下面的代码用到的变量或对象是在别的地方定义的,并且这个名字别的地方不能再用做变量名或对象名。声明可以出现多次。
定义:定义创建了对象并为这个对象分配了内存。声明没有分配内存。


3.特殊的几个关键字

  register:请求编译器尽可能的将变量存到CPU内部寄存器中。限制1:是尽可能,不是一定。限制2:register变量受限于寄存器约束,必须是一个单个的长度不大于整型的值。限制3:register变量可能不放在内存中,所以不能用取址运算符“&”来获取register变量的地址。

static:用法1:修饰全局变量,全局变量的作用域为“定义文件的”定义处到文件结束,定义前想用可用extern。用法2:修饰局部变量,作用域为函数内部,特点是函数退出后,静态局部变量的值位于内存的静态区,并不会销毁。用法3:修饰函数,静态函数(内部函数)的作用域仅限于本文件。static的好处是可以防止对象或函数重名。

sizeof:是关键字而不是函数,属于运算符。以下三种写法都正确。int i=0   A)sizeof(int)  B)sizeof(i)  C)sizeof i

case:后面只能是整形或字符型的常量或常量表达式

volatile:修饰的变量表示可以被程序外部修改。如电源开关。编译器不会对此类变量进行优化,一般如寄存器变量,一个端口的数据等。所以const volatile int i =10这种写法是正确的。表示i在当前程序内部会被修改,但程序外可能会修改这个值。


4.const与define区别

define没有类型修饰,在于编译期间进行简单的替换。对define的使用注意括号。

const严格来说是修饰只读“变量”,存放在静态区,在程序运行期间只有一份拷贝。值在编译时确定,有明确的修饰类型如 const int 同时const修饰的“变量”不能用于case

const用法1:修饰指针,忽略类型名,const离哪个更近就修饰哪个

                                 const int  *p  //p指向的对象不可变

                                 int const *p //p指向的对象不可变

                                 int * const p //p不可变           

const用法2:修饰函数参数,则参数值在函数体内不能被改变,编译阶段可发现此类错误

const用法3:修饰函数返回值,返回值不可改变

5.typedef与#define的区别

区别1:#define在预编译处理,typedef在编译阶段处理且不支持扩展如  typdef int  INT32                  unsigned INT32

区别2:#define PCHAR char*    PCHAR p1, p2       p2实际上为char              

             typedef char* pchar         pcahr p3, p4       p3 p4均为char*


常见错误:

1.对void指针进行算法操作 如p+1   不符合ANSI标准,但是GNU允许其和char*一致

2.函数return了局部变量

        3.extern const int i;//正确

            extern const in i = 0; //错误,const修饰只读变量,不能做左值

冷知识:

1.空结构体大小为1


内存划分

编译链接等

ifdef等

进程通信

线程通信

常见系统函数的实现 如memcpy

0 0
原创粉丝点击