struct Test{
int a;
};
int main(void){
int a=10;
struct Test *b = (struct Test*)&a;//int型强制转换成Test类型
printf("%d\n",*b);
printf("%d\n",b->a);
return 0;
}
解释:结构体的地址所指向的地址是第一个成员数据的地址,Test结构体只有一个int型数据,所以*b = b->a;
2.
//静态成员的使用和特点:静态成员函数是nomember类型的函数,可以做为callback函数使用
class A
{
public:
int a;
void print1(){printf("yyy\n");}
static void print(){
printf("xxx\n");
}
void printb(){printf("b = %d\n",b);}//成员函数可以访问静态成员变量
private:
static int b;//静态成员变量需要初始化,否则不能使用
};
int A::b = 0;//静态成员变量初始化需要在类定义之外,而且不需要加static关键字
void func(void (*f)())
{
f();
}
int main()
{
A a;
int *r = &a.a;
*r = 10;
printf("%d\n",a.a);
a.printb();
void (*f)() = A::print;//静态成员函数跟一般nomember函数使用一样
f();
// func((&a)->print1);//提示错误实参类型为void (A::)()与void (*)()不匹配
func(A::print);//A 类静态成员函数可以当成callback函数被使用
func(a.print);//正常
}
3.
//内存对齐问题,在win32系统下,C-Free 3.5编辑器验证
//结论是结构体体对齐以结构体成员类型最大值为对齐标准
//linux下gcc是4对齐,所以结果与win32环境不同
typedef struct{
char a;
char b;
char c;
int d;
}CHAR;
typedef enum{MON,TUE,WEN,THUR,FRI,SAT,SUN}WEEKDAY;
typedef struct{
char a;
int c;
double d;
char b;
}XXX;
int main(int argc,char* argv[])
{
printf("%d\n",sizeof(XXX)); //内存以double大小对齐 24 (linux 20)
printf("%d\n",sizeof(CHAR)); //内存以int大小对齐 8
printf("%d\n",sizeof(WEEKDAY)); //enum结构大小固定 4
}
4.unsigned int和int大不相同
for(unsigned t = 2; t >= 0; t--)
printf("%d",t);
输出结果是多少?
答案:这是个无穷循环,循环一开始输出210后t=(unsigned)-1,-1在内存中的表示是1111111111111111,是一个很大的值,这样程序又从unsigned最大值开始这样周而复始陷入死循环中。