*---优先左结合
1)两者区别
1)非空
指针可赋值NULL,即可以不指向任何对象
引用必须指向一个对象
2)合法性
引用在使用之前不需要测试其合法性
指针需要被测试,防止为空
3)可修改性
指针可以被重新赋值给新对象
引用一旦被初始化之后,总是指向初始化时被指定的对象
4)应用
指针
1)存在不指向任何对象的可能--此时设置指针为空
2)需要在不同时刻指向不同对象
2)指针包括
1)常量ptr
注意:char* p;---字符指针,遇到' '才结束输出
2)数组ptr
优先级:() > [] > *
数组指针---行指针:指向数组的指针 如:int(*ptr)[10];----ptr为一个指向一个10个int元素的数组的指针。
指针数组:一个数组里边装着指针类型的数据 如:int* ptr[];-----ptr[]内方的是地址
3)函数ptr
函数指针定义方式:函数返回值类型 (* 指针变量名) (函数参数列表);----指针变量名类型为 :函数返回值类型 (* ) (函数参数列表)
将“函数声明”中“函数名”改为了“(*指针变量名)”
作用:如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。
如:
int(*p)(int, int);
这个语句就定义了一个指向函数的指针变量 p。
前面的 int 表示这个指针变量可以指向返回值类型为 int 型的函数;后面括号中的两个 int 表示这个指针变量可以指向有两个参数且都是 int 型的函数。
所以语句的意思就是:定义了一个指针变量 p,该指针变量可以指向返回值类型为 int 型,且有两个整型参数的函数。p 的类型为 int(*)(int,int)。
4)this ptr
5)指向ptr的ptr
int ** p;
p[1] = *(p+1)-----脱衣穿衣法