- 指针即变量的地址 & 指针变量
- 指针变量i,则*i为i指向的变量
- 定义 int,char…… *p,赋值 p=&a
- *:取指针指向变量;&:取变量地址。二者优先级相同,自右向左
- 不能写:int *temp;*temp=*a,只能写temp=*a,因为temp指向的值是不可预见的,有可能破坏正常系统工作
1.指针与数组
- int *p ; p=&a[0]等价于int *p ; p=a,数组名即第一个位置的指针,因此在前章,数组传给形参若改变会改变原值,因为传递的是数组名即地址
- *(p+i)=a[i]
- p++是合理的,在数组的打印中,执行效率比a[i] , *(a+i)要高;而a是一个指针常量,不能a++
- ++与*优先级相同,*p++等价于*(p++),即先*p,再使p+1
- 形参数组:f(int array[])等价于f(int *array)
- 函数中可直接*(array+1)即形参数组名是指针变量,实参数组名是指针常量
- 函数形参可不指定数组长度就因为形参数组名是一个指针变量,不用开辟储存空间
- 注意数组找中间元素的地址,是p=p+(n-1)/2而不能直接等于(n-1)/2
- 不能只定义*array就当数组用
- 多维数组,如二维,a为第0行的首地址,a[0]=*a=*(a+0)即为第0行0列元素的地址,a[i]=a+i , a[i][j]=*(a[i]+j)=*(*(a+i)+j),即a是指向行的指针,加*后成为指向列的指针。指向行的指针和指向列的指针指向对象长度不同。
- p=&a[0][0](而不是p=a),则a[i][j]=*(p+i*y+j)(一共x行y列)
- 定义:int (*p)[4]表示指针变量p,指向包含4个整形元素的一位数组,p相当于a,不能写成int *p[4],指针数组
2.字符串指针
- 字符串可以定义char *string=“xxxxx”,相当于char *string;string=“”而不是*string=“”printf后用string即可,打印时系统自动不断+1,其中string是地址常量
- 可以直接用string[i]
- 注意不能直接char string=“”
- 定义:char *a=str(str为数组名)
3.函数的指针
- int (*p)(int, int)中p是指向一个函数的指针,而int *p(int, int)是一个函数,返回值为指向整型的指针,所以要加括号。赋值之后,如int max(int, int);p=max;p即为函数的入口地址,但p+1无意义。
- 调用:c=(*p)(a, b)
- 意义:作为实参传给a函数的形参,在a函数便可调用。若每次调用a函数要获得不同处理,但处理流程相同,只是需要不同函数,便可使用函数指针作为形参,以便每次调用所需函数,而a函数不需修改。
- 比如,给abc三数,第一次输出最大值,第二次输出最小值,第三次输出累和,便可用一个函数,分别调用不同函数来处理
- 返回指针值的函数,可以用于查找某特殊数据,找到所需数据的位置以便主函数使用
4.指针数组
- int *p[n]
- 二维数组可用指针数组实现,数组中的指针分别指向一位数组的第一位的地址,便实现了列数可变的“二维数组”,减少内存的消耗
排序时调整指向即可,也不需整排修改,快速实现排序
5.指针的指针
- int **p,其中*p是指向的指针
6.其他
- 初始化:p=NULL
- 两指针变量可相减,相加无意义
- void指针,引用时需强制转换:(char * )p/max()