程序员面试宝典笔记一二
一、实现两个变量的交换,不借助中间变量
void change(int &a,int &b){ //方法一,这种方法的一个问题就是可能两个数相加越界 //a=a+b; //b=a-b; //a=a-b; //方法二,利用异或 a=a^b; b=a^b; a=a^b; }
二、比较两个数值的大小,不使用任何流程控制语句
int max=(a+b+abs(a-b))/2;
三、sizeof和strlen的区别
(1)sizeof是一个运算符,然而strlen是一个函数
(2)sizeof可以使用类型、变量或者函数作为参数(不能用于未知存储大小数据的数据类型),然而strlen必须使用char*作为参数,兵器必须是‘\0’结尾
(3)sizeof 的结果在编译的时候就计算过了,因此可以用来定义数组维数,然而strlen只是在运行的时候才计算
(4)sizeof计算内存分配的最大空间容量,而strlen计算实际占用的空间
(5)sizeof 的结果类型是size_t;是在头文件中被定义为的unsigned int 类型。
(6)sizeof在计算结构体或者类型的大小的时候需要考虑对齐(对数据体成员或者成员变量的对齐),sizeof计算的是栈中的分配大小,对于存放在全局数据区的静态变量不会计算在内,
(7)空类的sizeof为1,多重继承的空类空间为1,虚继承空间为4,只有成员函数的为一个指针大小4,具有成员变量的sizeof需要考虑成员变量的对齐。
(8)当数组在函数中传递的时候,已经退化为了一个指针,如果需要其大小,需要传入额外的大小信息。
7 int main(){ 8 char *ss="0123456789"; 9 char s[10]="01234"; 10 int a[10]={1,2,3,4}; 11 string strArr1[]={"ab","cd"}; 12 string *pstrArr2=new string[2]; 13 cout<<"sizeof(ss)"<<sizeof(ss)<<endl;//结果是4 14 cout<<"sizeof(*ss)"<<sizeof(*ss)<<endl;//结果是1 15 cout<<"strlen(ss)"<<strlen(ss)<<endl;//结果是10 16 cout<<"strlen(s)"<<strlen(s)<<endl;//结果是5 17 cout<<"sizeof(a)"<<sizeof(a)<<endl;//结果是40 18 cout<<"sizeof(string)"<<sizeof(string)<<endl;//结果是4,相当于指针大小 19 cout<<"sizeof(strArr1)"<<sizeof(strArr1)<<endl;//结果是8,相当于两个指针大小 20 cout<<"sizeof(pstrArr2)"<<sizeof(pstrArr2)<<endl;//结果是4,指针大小 21 return 0; 22 } ~
四、指针
指针和引用
指针可以指向空值,引用不能为空,必须在定义的同时进行初始化,并且不能改变,当然引用变量的内容可以改变
const常量也必须在定义的同时进行初始化