{//数组参数问题 void fun(int a[])//传入的是一个整形的地址,sizeof(a)=4 void fun1(int c[])////传入的是一个字符的地址,sizeof(c)=4 } {//二级数组指针 int a[5][10]; printf("%d,%d,%d",a,a+1,&a+1);//a和&a都是指像首地址,而a+1移动的是10*4=40个字节的位置,而&a+1是移动了整个的大小既5*10*4=200个字节 } {//数组指针移动问题 int a[5]={1,2,3,4,5}; int *ptr1=(int*)(&a+1); int *ptr2=(int*)((int)a+1);//前进了一个字节,8位 printf("%x,%x",ptr1[-1],*ptr2); //5 20000000 } {//在变量中改变实参,二级指针,引用可改变指针的值。 //在函数内部改变指针的值(而不是指针指向的值),必须传递指针的指针或者指针的引用。 void func1(MyClass *pMyClass) { DoSomething(pMyClass); pMyClass=pOtherObject;//其他对象的指针 } MyClass *p=NULL; func1(p);//不改变p的值,而是(*p)里面的内容. ------------------------------------------------------------------------------------------------- void func2(MyClass **pMyClass) { *pMyClass=new MyClass; ...... } MyClass *p=NULL; func2(&p);//改变p的值,有影响 ------------------------------------------------------------------------------------------------- void func3(MyClass *&pMyClass) { pMyClass=new MyClass; ...... } MyClass *p=NULL; func3(p);//改变p的值,有影响 } {//防止野指针 int *a=(int*)malloc(sizeof(int)*10); free(a);释放指针 a=NULL;//防止野指针 } {//交换值 //(a^b)^b=a; int a,b; a=a^b; b=a^b;//a^b^b=a a=a^b;//a^b^a=b } { 32位(x)取某一位y的值 (x>>y)&0x1 第n位清零 : #defin BITN (1<<n) a|=BITN a&=~BITN 清楚最右边的1:a&(a-1) } {//自然对齐 typedef struct _a { char c1; long i; char c2; double f; }a; sizeof(_a)=24;//每个类型的开始必须为其sizeof的整数倍。结构体大小还要满足最大类型的增数倍。 typedef struct _b { char c1; char c2; long i; double f; }b; sizeof(b)=16; --------------------------------------------------------------------------------- //强制对齐 MS #pragma pack(8) struct s1 { short a;//2空2. long b;//4 };//一共8个。 struct s2 { char c; //因为s1大小为8.空7 s1 d;//大小为8 long long e;//大小为8 }//一共24个 struct s3 { char c;//1空1 short a;//补足剩下2 long b;//4 long long e;//8 };//16 #pragma pack() } { //查看每一位的数值 char b=-2; for(int i=0;i<8;i++) { printf("%d\n",b&(0x01)); b>>=1; } } {//查看整数高地位存储情况(低位) int x=0x01; char *p=(char*)(&x); if(*p==1) printf("Lower_store"); //将低位转换为高位存储 int chgendian(int x) { int tmp=0; char *p=(char*)&x; int shift=sizeof(int)*8-8; for(int i;i<4;i++) { tmp|=*p<<shift; shift-=8; p++; } return tmp; } /* *p=2a *p<<shift=2a000000 *p=2c *p<<shift=2c0000 *p=a *p<<shift=a00 *p=0 *p<<shift=0 */ {//变量存储区域,生命周期 int g_count;//全局变量,存储在静态存储区域,生命期为整个程序 int func(int x) { static s=0;//静态变量,存储区为静态存储区,生命周期为整个程序 s+=x; return S; } int main() { int *a=(int*)malloc(sizeof(int)*10);//为在堆上申请内存,要手动释放 char *str="Hello,World";//为栈上变量,main() int a;//局部变量,存储为栈,生命期为main() for(int i=0;i<10;i++)//i为局部变量,存储区为栈,生命期为for { xxxx } } }