记住:
- 在C中,指针和其它基本类型一样,是分类型的,根据类型不同,操作会迥异。
如 int *ip;
float *fp;
ip++;
fp++;
每次增加的地址数不同。
- 也有无类型的指针 void * ptr,这时就不能对ptr进行加量或减量。如:
ptr++
- 指向函数的指针
int (*min)();
函数的指针可以忽略函数的参数,也可以指定函数的参数。
-----------------------------------------------------------------------------------------
符合的函数指针用法:
typedef int (*funPtr)(int); // 定义一个函数指针类型,原型是 int (int)
int (*fun1(float))(int); //fun1的函数声明,表示fun1的参数是 float,返回值是函数指针 int (int)
int sub(int i)
{
return 1;
}
int (*fun2(float i))(int) //fun2的定义,和函数fun1一样的声明
{
printf("%d", 1);
return sub;
}
funPtr fun1(float f) //fun1的定义,使用funPtr类型来简写,也可以写成和fun2一样的格式
{
printf("%f",f);
return sub;
}
void main(void)
{
printf("%d", fun1(1.0f)(1)); //一次调用两个函数
}
提示:也可以把函数指针当作参数类型。
-----------------------------------------------------------------------------------------
数组和指针是有对应关系的:
一维指针对应一维数组,如
byte a[] = {1, 2, 3};
byte *pA = a;
pA[i]或pA++ 就可以遍历数组.
二维指针对应二维数组,如
byte a[][2] = {{1, 1}, {2, 2}};
byte (*pA)[2];
pA = a;
但此时的指针类型已经是二维, pA[i], pA++就不可以遍历整个数组了,它遍历的是二维数组的高维,如a[0][0],a[1][0].
由于数组的排列顺序是已定的,经常使用一维指针指向任意维数组, 自行计算位置如 (pA + j * 2) + k。
不指定明确数组个数也是可以的, byte (*pA)[];
注意 * 号对二维数组的含义,如 ((*pA) + 1) 结果就是指向第一维的一个元素, 而 (*(pA+1)) 是指向第二维的元素。
指针会记住类型,从而对+1等移位计算产生影响, pA是二维的, *pA就降一维。
有一个技巧是用于数组向指针赋值的。
如数组 byte a[][2] = {{1, 1}, {2, 2}};
知道 a是等于&a,即是否取地址都是数组的地址,是一样的值,但它们的含义是不同的。
如
byte a[][2] = {{1, 1}, {2, 2}};
byte b[] = {1, 2};
byte (*pA)[2];
pA = a; //OK, 没有warning
pA = b; //有warning, 说类型不匹配.
pA = &b; //OK, 没有warning
由上面试验可见,数组的直接名称 a,b等,代表数组的第一个值的地址类型,类型是byte*,而&b代表数组的地址,类型是数组地址 (byte*)[2]。
(*pA)[0] (*pA)[1]就可以访问数组的值。