现在的位置: 首页 > 综合 > 正文

第一章

2014年03月05日 ⁄ 综合 ⁄ 共 2238字 ⁄ 字号 评论关闭
{//数组参数问题
	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
		}
	}
}

 

抱歉!评论已关闭.