今天又去ibm笔试和面试了,又一次被bs了。题目更加的怪异。
void test(char t[100]){
char * p = t;
cout<<sizeof(p)<<endl; //4
cout<<sizeof(t)<<endl; //4
}
两个结果都是4,晕死
int b =10;
int & a = b;
int * p = &a;
可以取得a的地址和b的地址一样,看来引用是变量的别名这个说法还是对的。
“xyz”[2]是z,也可以char t = "xyz"[2];
取地址的话是:const char * te = &("xyz"[2]);
枚举型是常量表达式,里面所有的元素都是常量
enum flag{x=1,y=2,z=5}
flag g = flag(123); //把123转化为flag枚举型
x^=y^=x^=y这个顺序是从右到左,然后这个结果和x=x+y;y=x-y;x=x-y;相同。这个东西太怪异了。
struct Test1
{
int a:5;
int b:4;
int c:7;
};
Test1 t;
t.a=31;
t.b=2;
t.c=0;
int * p = (short*)&t;
又是这道题目,如果在小端的机器上,t对应的内存应该是|00000000|01011111|即a,b,c依次放在内存从低到高地址。所以此时的值时95。
如果是大端,则内存的值为01011111|00000000。此时的值时0x5f00。
记住x86是小端,即一个数值的低位部分存放在内存的低地址,高位部分存放在内存的高地址。
大端则相反,即一个数值的低位部分存放在内存的高地址,高位部分存放在内存的低地址。
用macro写MIN(a,b),#define MIN(a,b) (a)<(b)?(a):(b),错误的例子是int a = 1; MIN(a++,123),这样a++会调用两次。
可以用template+inline来代替macro
template<class T>
inline int min1(T a,T b){
if(a<b)return a;
return b;
}
void * p = malloc(0);
if(p == NULL){
cout<<"it is not allocated"<<endl;
}
else{
cout<<"it is allocated"<<endl;
}
在gcc上是it is allocated.根据c98的规范:
就是说当malloc的参数为0时,可能返回一个NULL,也可能返回一个合法地址,但是不应该用这个地址去访问内存空间。
class T{};
T * tt;
T t;
*tt=t;
如果T没有数据成员,则这个代码执行没有问题,但是如果T有成员变量,则会segmentation fault.