指针

 

记住:

  1. C中,指针和其它基本类型一样,是分类型的,根据类型不同,操作会迥异。

int *ip;

   float *fp;

ip++;

fp++;

每次增加的地址数不同。

 

  1. 也有无类型的指针 void * ptr,这时就不能对ptr进行加量或减量。如:

ptr++

  1. 指向函数的指针

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]就可以访问数组的值。

 

 

 

你可能感兴趣的:(指针)