int * (*pfun)(int);//p是一个函数指针,指向一个有int型的参数,并且返回值是一个int型的指针
int * fun(int);//func是一个指针函数,函数的返回值是指针
pfun = fun//把函数的地址赋给函数指针
(*pfun)(a)//int a ,通过函数指针调用这个函数
不要返回局部变量的指针和引用
约定为32位系统,即char1字节、short2字节、int4字节
该问题总结为两条规律:
1,每个结构体成员的起始地址为该成员大小的整数倍,即int型成员的其实地址只能为0、4、8等
2,结构体的大小为其中最大成员大小的整数倍
struct A{
char a;
int b;
short c;
};
struct B{
char a;
short b;
int c;
};
sizeof(A) == 12sizeof(B) == 8
typedefunion u
{
char a;
int b[5];
double c;
int d[3];
}U;
typedefstruct s
{
int e;
double f;
short g;
U h;
char i[2];
}S;
U大小至少要容纳最大的b[5]=4*5=20字节,同时要是变量类型最大值得整数倍,即sizeof(double)=8的整数倍,所有sizeof(U)=24
s的大小计算,联合体的自身对齐值为成员变量的最大对齐值,也就double的自身对齐值8(起始地址为0/8),所以s得大小为0+4+4+8+2+6+24+2+6=56
大端小端
大端:低地址—>高地址 数据的高位—>低位
小端:低地址—>高地址 数据的低位—>高位
都是从低地址—>高地址,大端从高位开始
判断大端小端的函数
true/falsebool checkCPU()
{
union w
{
int a;//四个字节char b;//一个字节
}c;
c.a = 1;
return (1 == c.b);//小端模式为true
}
a 和 b 共享内存,当是小端模式时低地址是数据低位 1,c.b的值才能是1
按位异或运算
位运算都是补码参与运算
正数的原反补码都相等
负数的补码 = 原码取反(第一位符号位不变)+ 1
不引入第三变量,交换两个变量的值(设a=a1,b=b1)
#include <iostream>
using namespace std;
int main()
{
int a = 9999, b = 1000;a = a^b;
b = a^b;a = a^b;
cout << a << b << endl;return0;
}
输出 a = 1000, b = 9999;