标签:指针 赋值 类型转换 数组 不能 可变 通过 输出 int
·
指针
 指针:指针就是地址
	 指针变量:存放变量地址的变量
	 使用指针的目的:要通过指针能够找到被指的变量,或者说要通过指针间接访问被指的变量
		取变量;栈区
		
	 int *p 指向int类型的指针
		%p 输出指针
		&取址符
		
	初始化
		int *p=NULL; 必须初始化
				
		定义时放*(*p=&a),赋值时不能放(p=&a )
			* 类型说明的作用
			  间接访问指针指向内存的值的作用
				
		p=&a; 打印:p为地址,*p值为a		
					
				
				
				
	void 类型的指针
		可以指向任何变量,但在使用时,需要进行强制类型转换之后才能使用
		
		void *p=&a;
		printf("%d",*(int*)p);
				
				
				
	指针大小:都为8个字节			
				
	指针运算:只能加减、不能乘除
		
		p+n = p+n*sizeof(指向类型)		
				
				
				
	指针访问数组			
				
		1、数组名实际上就是一个指向该数组中第一个元素的指针
		2、在实际数组元素前面加一个&与  p=&a[1];
		3、在数组名后加偏移量,改变指向的数组元素
				
		*(p+n) = array[n] = *(array + n);
		p[0] == array[0];可以这样
		
	访问数组两种方式:
		下标法访问  数组名[下标]   指针[下标]
				
				
				
	const指针
		const int* p 指针指向的变量不可改变、可以修改指向、其指向内存被const修饰不可改变 
		            (const 在 * 左边,修饰int)
 		int const* p 值不可变
		
		int *const p (const在*右边,修饰指针)指针不能改变指向
		
		const int *const p  只能初始化,都不能改
		
		
		const在星号左边:
			修饰的是指针指向的内存
			1.指针可以改变指向
			2.不可以通过指针改变其所指内存的值
			
		const在星号右边:
			修饰的是指针变量本身
			1.指针不可以改变指向
			2.可以通过指针改变其所指内存的值
			
		const在星号左右
			1.不可以改变指向
			2.不可以通过指针修改值
			
			
		注意:变量本身仍可以通过变量名去修改		
				
				
				
	指针与字符串
		字符数组表示字符串
		用字符指针指向一个字符串表示,指向首地址
		char* str1 = "beijing"  str1仅记录首地址
			beijing存在数据区(常量不能改),不能根据str1[1]=E;修改
			
		strcat不能用指针拼接。		
		strcpy		
				
				
	指针与函数
		指针变量作为函数参数:将指针变量以实参的形式传递给函数,进行的是地址的传递,所以可以在函数中改变实参的值
		
		数组名作为函数的实参和形参:进行地址传递
		
		函数的返回值是一个指针:函数的返回值类型必须定义为指针类型		
				
	
	函数指针:指向函数的指针
	
		数据类型(*指针变量名) (形参列表)
		int (*p)(int a) --int(* )(int a)指向返回值为Int的函数指针
		int *p1(int a)   -- (int*) (int a)  返回值为int*函数。函数名为p1
		括号不能省
		int *(*p2)(int*a,int*b)  ----指向返回值为int*,参数为。。的函数指针
		
	指向函数的指针变量的说明:
	1、把函数首地址赋给指针变量时,直接写函数名即可,不用写括号和函数参数
	2、利用指针变量调用函数时,要写明函数的实际参数
	
	p=func1;			p(20) == func1(20)
		//函数名就是函数的首地址
		//表示函数指针P指向func1
		
	指针访问二维数组
	
		int a[3][4];
		int (*p)[3][4];
		p=&a;  *p == a;
		(*p)[1][1];
		p[0] ==*p;
		p[0][0][0]=a[0][0]
		p[0][1]=a[1];
	指针的指针(二维指针)
		如果一个指针变量存放的是又一个指针变量的地址,则称这个指针变量为指向指针的指针变量。
		
		int a;
		int *p=&a;
		int **p=&p;
		**p == a 
	指向数组的指针
	定义:类型名称 (*指针名)[数组长度]  
	如:int a[5]={1,1,1,1,1};int (*p)[5]=&a;
	定义时不加括号就成了指针数组,因为[]优先级比*高。
	数组指针定义时的数组长度,元素类型需与指向的数组相同
	
	int(*p)[5];指向数组长度为5的整型数组的指针
	char* (*p1)[10];指向类型为char* [10]的数组指针
	int *p2[10];一个数组 类型为int* [10]
	数组指针指向的是整个数组,不是单个元素
	数组指针加1,相当于p+sizeo(数组名)
	访问数组元素:a[0],*a,*(a+1),(*p)[0],p[0][0]   (*p)==a, p[0]=a;
	指针(数组)
	如果数组元素都是指针变量,构成指针数组
	一般形式:类型名称 * 数组名[数组长度]
	int* a[10];每个元素都是int* 指针
标签:指针 赋值 类型转换 数组 不能 可变 通过 输出 int
原文地址:http://www.cnblogs.com/yujiamin/p/7325362.html