*ptr += 12 应为 *ptr = *ptr + 12;ptr++ ;
Printf(“%d,%d\n”,a,b);printf的参数是从右向左计算。
运算符优先级
(int&)a 相当于将变量a所在地址开始的sizeof(int)个字节当成int型的数据输出。
如果一个操作数是long型,一个是unsigned int型,那么只有机器上的long型的长度足以存放unsigned int的所有值时(32位机一般不满足),unsigned int 才会转化为long型,否则两个操作数都被提升为unsignedlong型。若两个操作数都不是long型而其中一个是unsig int型,则另一个也被转换成unsigned int型,否则俩个操作数都一定是int型
Unsigned char a = 0xA5;
Unsigned char b = ~a>> 4+1;
计算上述表达式时,编译器先把a和4 转换成int类型()所谓整形提升后再进行计算,当计算结果出来后,再把结果转换成unsigned char 赋值给b
~ 优先于>> 和 + 。所以先取反,再进行加法运算,最后进行移位最后 b = 250;
(X & y) + ( (x ^ y)>>1) 表达式用来计算x和 y 的平均值。
交换a 和 b 的值: 1,a = a + b; b = a-b; a = a-b; 2,a = a ^ b; b = a ^ b; a = a ^ b;
Const关键词:1,可以定义const常量。2,可以修饰函数的参数和返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,提高程序的健壮性。
Const常量有数据类型,宏没有。编译器对前者有类型安全检查,后者仅进行字符替换,
对于 n 字节的元素,它的首地址能被n整除,才能获得最好的性能。
空类所占空间:
指针和引用的区别:
1, 非空区别,在任何情况下都不能使用指向空值的引用。使用引用的代码效率比使用指针要高
2, 合法性区别。在使用引用之前不需要测试起合法性,但指针应该总是被测试,防止其为空。
3, 可修改区别。指针可以被重新赋值指向另一个不同的对象。但是引用则总是指向在初始化被指定的对象,不能改变,但其指定的内容可以改。
证明引用的同时必须同时初始化。Const常量赋值时必须同时初始化。
#include<stdio.h>
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;
}
GetMemory中的*p实际上是主函数中的str的一个副本,编译器总是要为函数的每一个参数制作临时副本。
编程中很难发现错误的是迷途指针。迷途指针也叫悬浮指针、失控指针是当对一个指针进行delete操作后——这样会释放他所指向的内存—并没有把他设置为空产生的。
Malloc/free new/delete
Malloc与free是c++/c语言标准库函数,new/delete是C++的运算符。他们都可以用于动态内存的申请与释放。
对于非内部数据类型的对象而言,只用malloc/free无法满足动态对象的要求。对象创建时要执行构造函数,消亡时要执行析构函数,malloc/free为库函数,不在编译器的控制权限内,不能够把执行构造函数和析构函数的任务强加于malloc/free. C++需要一个完成动态内存分配和初始工作的运算符new
以上节选自:《程序员面试宝典》