| 
 一.指针 int  *p=&a; p=&a; *p=a; 注意:在定义时和应用时*p的含义不一样  
 /*  1.指针:用于存储某一个地址,从而可以通过地址直接对该地址内存空间的数据进行操作      1).是一种保存地址的变量      2).是一种数据类型  2.特点:  1).指针本身也是地址,指针定义之后自身地址不变,但是里面存的地址可以变化  2).&p--->指针自身地址     p---->表示指针存的地址     *p--->表示指针所存地址的内存空间(所存地址对应的值)  3).指针不初始化不能使用(未赋值前地址是随机的)  4).int *p[3];--->指针数组     int (*p)[3];--->数组指针  5).指针是什么类型的,就应该存什么类型的地址,否则*p取对应内存空间的值会出错    */  
 
  
 /*  1.指针数组:例 int *p[3];表示定义一个可以存放三个int指针的数组  赋值:int a1=1,a2=2,a3=3; int *p[3]={&a1,&a2,&a3}; 取值:int *a=p[0];  表示一个数组,用来存放指针的数组就叫指针数组,数组里面的元素都是指针    2.数组指针:例 int (*p)[3];表示这是一个含有三个元素的int数组的指针  赋值:int arr[3]={1,2,3}; int (*p)[3]=&arr;  表示一个指针,而这个指针类型就是数组.    3.数组元素的指针  赋值:int arr[1]={1}; int *p=&arr[0];  表示一个指针,而这个指针存的是数组一个元素的地址    */  
 /*  1.当c是角标为m元素的指针的时候,c[x]=arr[x+m]  2.当用指针取元素时,如果出现越界,编译器不会报错(因为指针操作的是地址)  3.当用数组角标取元素时,如果出现越界,编译器会报错 */  
 数组与指针的异同点    相同点:  1.二者都含有一个地址.  2.二者都能通过*变量名取值  3.二者都能通过变量名[角标]去取值.  4.二者都可以进行地址运算.    不同点:  1.二者是不同类型.数组:是构造类型 指针:指针类型  2.数组的字节长度是动态的,与类型和长度有关.而指针字节数是一致的(同一环境)  3.数组用变量名[角标]取值时越界会有警告.而指针没有.  4.数组用变量名[角标]取值时角标是谁的,就是哪个元素.但是指针是用当前地址对应的角标+当前给定的角标.  5.数组里面的地址不可以改变,而指针可以.    结论:数组具有指针的一部特性,但是它不是指针.二者是完全不同的两个数据类型  
  1.指针型函数:是函数,这个函数的返回值类型时指针  定义:类型 *函数名(参数){return 指针类型;}  例如:int *add(int *a){return &a;}    2.函数指针:是指针,函数也会在内存开辟一块空间,函数指针即这块空间的地址  定义:函数返回值类型 (*指针名)(参数类型);  赋值:指针名=函数名;  例如:先定义函数int add(int a){...}  int (*p)(int)=add;  使用:指针名(实参);如:p(3)等效于add(3);  
  
 |