指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针

1、指针数组

   在C语言C++语言中,数组元素全为指针的数组称为指针数组。一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。即有诸形如“ptr_array[i]”的指针。指针数组中的元素亦可以表示为“*(*(ptr_array+i))”。又因为“()”的优先级较“*”高,且“*”是右结合的,因此可以写作**(ptr_array+i)。由于数组元素均为指针,因此ptr_array[i]是指第i+1个元素的指针


2数组指针

   指的是数组名的指针,即数组首元素地址的指针。数组指针是指向数组地址的指针,其本质为指针。例:int (*p)[10]; p即为指向数组的指针,又称数组指针。

为了能更好地理解数组指针,与普通指针及二级指针的区别,下面举例说明一下。

例如:

{

int a[4][5];

int (*p)[5]=a;

}

这里a是个二维数组的数组名,相当于一个二级指针常量;

p是一个指针变量,它指向包含5个int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位;

*(p+i)是一维数组a[i][0]的地址;

*(p+2)[3]表示a[2][3]地址(第一行为0行,第一列为0列),*(*(p+2)[3])表示a[2][3]的值。

//(*p)[5]其中的5换成其他的数字在vc++6.0环境中都无法通过编译

(*p)[5]其中的5在上述例子中没有表示任何意思你可以换成除0以外的整数,[5]的作用就是帮助你记忆说你所指向的一维数组的长度。(不过除了与定义的二维数组的长度一致的不会警告之外 )其他的数会警告但是不影响结果。

 


3、函数指针

<1>函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数

 <2>函数指针的声明方法为:

返回值类型 ( * 指针变量名) ([形参列表]);

1:“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:

int func(int x); /* 声明一个函数 */

int (*f) (int x); /* 声明一个函数指针 */

f=func; /* 将func函数的首地址赋给指针f */

或者使用下面的方法将函数地址赋给函数指针:

f = &func;

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

2:函数括号中的形参可有可无,视情况而定


4、函数指针数组

把函数的地址存到一个数组中

例如:

int (*parr1[10]])();

int *parr2[10]();

int (*)() parr3[10];

函数指针数组的用途:转移表。


5、指向函数指针数组的指针

 指向函数指针数组的指针是⼀一个 指针 指针指向⼀一个 数组 ,数组的元素都是 函数指针,例如:

void test(const char* str)

{    

printf("%s\n", str);

}

int main()

{    

// 函数指针 pfun    

void (*pfun)(const char*) = test;   

  // 函数指针的数组 pfunArr    

void (*pfunArr[5])(const char* str);    

pfunArr[0] = test;    

// 指向函数指针数组 pfunArr 的指针 ppfunArr    

void (*(*ppfunArr)[10])(const char*) = &pfunArr;    

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值