int main()
{
int arr[]={6,7,8,9,10};
int *ptr=arr;
printf("%d,%d\n",*ptr,*(++ptr));
cout<<*ptr<<'\t'<<*(++ptr)<<'\n';
return 0;
}
这个输出是7,7
8 8
C中printf计算参数时是从右到左压栈的。
然后我想实践一下cout的效果,发现原来cout也会有压栈顺序的!
2.类型转换
float a=1.0f;
cout<<(int)a<<endl;
cout<<(int &)a<<endl;
cout<<((int)a==(int &)a)<<endl;
输出是1
1065353216
0
因为float a=1.0f在内存表示是3f800000
强制转换,会把内存值当int输出。
但是f=0.0f就都是0, cout<<((int)a==(int &)a)<<endl;输出为true、
unsigned int a=0xFFFFFF7;
unsigned char i=(unsigned char)a;
char *b=(char *)&a;
printf("%08x,%08x",i,*b);
输出是000000f7,fffffff7
可以 先通过
union{int a;char c;}t;
t.a=0;
t.c=1;
测试机器是大小尾端
3.const
在const函数中可以改变mutable数据。
4.sizeof
P50
struct
{
long a1;
short a2;
}A;
sizeof(A)大小是8,因为要数据对齐。
编译器还会对函数进行调整为了内存对齐。
性能要求地址总线总是按照对齐后的地址来读取。
可以用pack来禁止对齐调整。
P79C++有了malloc/free,为什么还需要new/delete?
对于非内部数据类型的对象而言,只用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在小王之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free,
句柄和指针的区别。
auto_ptr使用
P81 auto_ptr放入contatiner是不正确的。