您的位置:首页 > 职场人生

程序员面试宝典知识点笔记

2015-07-30 16:03 363 查看
野指针的产生有三种:1,指针变量未被初始化;2,动态内存中指针被free或delete释放后没有置NULL;3,指针操作超越了变量的作用范围如访问数组越界的


c中printf 计算参数时 是从右向左压栈的。 printf("%d,%d",a,++a); 两个数输出结果一样

编译器不允许对常量赋值

float a; (int&)a 将变量a 用int 类型来解释

int a=0x11223344; char *p=(char*)(&a) 则*p 的值在小端模式下取值为0x44 *p 的含义为: 在a的起始地址处取一个字节宽度的数据

利用这个可以判断系统是小端还是大端。

隐式类型转换: 1)混合类型的算术表达中,规则: 最宽的数据类型成为目标转换类型

为防止精度损失如果必要的话类型总是被提升为较宽的类型

整形提升: 所有含有小于整型的如char unsigned char, unsigned short ,short enum 类型的算术表示达式在计算之前其类型都会被转换成整型

运算符优先级当中逻辑! 位取反~ 取地址符 &a 解引用符*p ++ -- 优先级比加减乘除和取余数 高。 + - 运算符的优先级大于 左移,右移,赋值操作符和+= -= 复合操作符的优先级比较低,最低的的是逗号操作符。

c++ 程序调用c语言函数是要加extern "c"

时常在cpp的代码之中看到这样的代码:
#ifdef __cplusplus
extern "C" {
#endif
//一段代码
#ifdef __cplusplus
}
#endif

头文件中 #ifndef #ifdef #endif 的作用是防止头文件被重复引用。

switch(a++){case 1:break; default:break} 在执行switch中的语句时使用的是a的初值,在执行完switch 语句中的所有程序后a再自加加

任何算数运算在作除法操作时一定要保证分母不能为0 if(n){sum/n;}

const 意味着只读不可变的

const最常用的就是定义常量,除此之外,它还可以修饰函数的参数、返回值,类中的成员函数,修饰指针和函数的定义体

const 关键字可以作为函数重载的区分

const 成员函数可以理解为只读函数,把不改变数据成员的函数加上const 关键字进行标识,可以提高程序的可读性,和程序的可靠性。

在声明const成员函数时 const 放在函数的最后 如 int Add(int x,int y)const ; 如放在前面表示修饰函数的返回值了。

const 与#define 相比: 两者都可以用来定义常量,const 常量有数据类型,编译器会进行类型检查,而#define 定义的常量只是简单的字符串替换。

在c++ 中const 常量完全可以取代#define 宏常量

在const成员函数中,用mutable 修饰成员变量后,可以修改类的成员变量

内存数据对齐指 数据的内存地址是数据长度的整数倍

访问内存时 地址如按照4字节对齐,则访问效率会高很多,不然如: 想得到0x00000001 开始的4字节内容,系统首先需要以0x00000000为开始地址读四个字节,从中取出3个字节,然后再从0x00000004处取四个字节再从中得到第一个字节 然后两次组合再得到想要的内容,这样效率比较低。

无论是全局静态变量还是局部静态变量都是放在全局数据区的。

sizeof 和strlen 的区别: sizeof 是运算符,可以用类型做参数,主要用来计算变量在内存中所占的字节数,strlen是字符串函数 只能用char* 指针作为参数且必须以字符串结束符‘\0’结尾用于计算字符串长度。

对于sizeof; sizeof() 括号内的内容在编译过程中是不被编译的,而是被替代类型,sizeof(x) 的值在编译的时候就知道值了可以用来定义数组的维数。

int a=8; sizeof(a=6) 计算是被替代成sizeof(int) 其中a的值不变依然是a=8;

对函数使用sizeof 在编译阶段会被函数返回值的类型取代 int fun(){return 0;} sizeof(fun()) 计算的是函数返回值类型的大小。

int a[10][10] 计算数组的大小时是维数的乘积*数组元素的大小 sizeof(a)=10*10*sizeof(int)

内联函数和宏函数的区别: 内联函数要做参数类型检查,它直接将代码内容插入到函数的调用处,节省了函数的调用的开销从而提高了函数的执行效率。而宏函数只是进行简单的字符串替换不会进行类型检查常会产生意想不到的结果。在c++中内联函数可以取代宏函数。

定义内联函数时关键字inline 必须与函数定义体放在一起才能使函数成为内联函数。 inline 不应该出现在函数的声明中。

inline内联函数的定义体一般放在头文件中用户是可见

内联函数一般用于,函数不断被重复调用,而函数体只有简单的几行不含有复杂的语句如for while switch语句。

内联函数以代码膨胀为代价,省去了函数调用的开销。从而提高了函数的执行效率

指针与引用的区别: 指针其实是内存地址,程序需要为指针变量分配内存。而引用只是给变量取了个别名不需要分配内存空间。指针可以为空,而引用不能为空。引用只能在定义的时候被初始一次,之后不可改变,而指针是可变的。 引用在使用之前不需要检测其合法性。而指针应该总被测试防止其为空。指针和引用的自增(++)运算意义不一样。

在定义一个引用的时候必须同时初始化,const 常量在定义时必须初始化。

函数参数的传递方式有 值传递,指针传递(又称地址传递) 引用传递。 其中值传递方式,传递的只是变量的副本

栈:栈内存是由编译器自动分配和释放的,局部变量的内存是从栈中得到的。栈上的内容只在函数范围内存在。 堆:堆内存一般由程序员自己分配和释放,由malloc new 动态分配的内存。 全局数据区: 全局变量和static 变量

字符串常量保存在只读的数据段(文字常量区

函数可以返回局部变量的的值,但不能返回局部变量的地址 准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。

函数在执行完后会释放栈中的内存。。。

指针中,两个地址值相减 最后要除以类型所占字节的大小。

函数需要在它被调动前被声明。在main 中可以不写return 语句编译器会隐式返回0, int main(int argc,char *argv) argc argument counter 参数的个数,argv argument vector 参数的值

p[0]等价于*(p+0) p[1] 等价于*(p+1) int a; 假设a的地址为0x00000000; int *p=&a; p+3= 0x00000000+ 3*sizeof(int)

定义一个函数指针 int max(int ,int ); int(*p)(int,int)=&max;

数组名是指向数组第一个元素的常指针,函数名是指向函数的常指针。

空指针和迷途指针的区别: 空指针为NUL 迷途指针是指,当delete 一个指针时,编译器释放内存,但指针本身依然存在这时指针为迷途指针。使用空指针和迷途指针都是非法,可能会导致程序崩溃,不过,空指针导致的崩溃是可预料的

c++中有了malloc/free 为何还需要new/和delete .

malloc 需要自己手动计算分配内存的字节数,malloc和free 是c/c++语言中的标准库函数,而new delete是c++ 的运算符。

对于自定义类型的对象而言用new 和delete 申请动态内存和释放内存时会自动执行对象的构造函数和析构函数,而malloc 和free 不行

指针和句柄的区别: 句柄和指针是连个截然不同的概念,windows 系统用句柄标记系统资源。。。。指针是内存地址

this 指针本质上是类中非静态成员函数的一个参数,只是编译器将其隐藏起来了。非静态成员函数默认的第一个参数为 T * const this, this 指针是指向调用成员函数类对象的常指针。

this 只能在成员函数中使用,全局函数,静态函数都不能使用this this 指针在成员函数开始执行前构造,在成员函数执行结束后清除。

在调用类的非静态成员函数时,编译器会隐式的传入一个this 指针
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: