数组,函数,指针

1. 指针数组

是数组,是一个存放指针的数组

例1:int  *arr1[3];  //是一整型指针数组,该数组中有3个元素,每个元素均为指向整型数据的指针

           char *arr2[4];  //同理,是一字符型指针数组,该数组中有4个元素,每个元素均为指向字符型数据的指针


注意:[ ]的优先级比*的优先级高,所以,arr先与[ ]结合,形成数组,又因为有个*,所以为指针数组


例2:char **arr3[2];

按照上述的判断方法,arr3先与[ ]结合,形成数组,又因为char **,所以为二级指针数组,即该数组有2个元素,每个元素均为一个二级指针


2. 数组指针

是指针,是指向数组的指针,存放数组的地址


例3:int (*p)[10];

由优先级知,因为有()的存在,p先与*结合,形成指针,所以该变量为指针变量;

此时,把(*p)看做一个变量整体,如a,则原式就变为:int  a[10];该变量为整型数组;

所以两部分结合起来即为数组指针。

在本例中,指针p指向一个有10个元素的整型数组。


注意:在表示为指针时,因为[]比*的优先级高,所以一定要加().


例4:char (*pc)[5];  //该变量为指向具有5个元素的字符数组的指针


例5:int (*p[10])[5];  //数组指针数组

首先,由优先级,p先与[10]结合,所以该变量即为数组

其次,将p[10]看做一个整体,如a,则与变量即为int (*a)[5]

最后,由上述例3可知新的变量int (*a)[5]为数组指针

所以,结合起来,原变量即为数组指针数组。


例6:int *(*p)[10];  //指针数组指针

首先,()的优先级最高,所以p先与*结合,形成指针,所以该变量即为指针

其次,将(*p)看做一个整体a,则原变量变为 int *a[10]

最后,由上述例1知,int *a[10]为一指针数组

所以,原变量即为指针数组指针。


3. 函数指针

是指针,是指向函数的指针,存放函数的起始地址。

函数的地址即为第一条指令的地址,通常函数的地址可以函数名或者&+函数名表示。


例7:void (*pfun1)();  //该变量为函数指针

首先,()的优先级最高,所以pfun1先与*结合形成指针,故该变量为指针

其次,将(*pfun1)看做一个整体a,原变量可看*结合做 void a();

最后,void a()即为函数。

所以,原变量即为函数指针。


例8:void *pfun2(); //指针函数

因为()的优先级最高,所以pfun先与()结合形成函数

然后再与*结合形成指针,故原变量为指针函数。


4. 函数指针数组


例9:int (*p[10])();

该变量为函数指针数组

首先,在()中,[]的优先级最高,所以p先与[]结合形成数组,整体记为a,所以该变量即为数组。

其次,在()中,a与*结合形成指针,(*a)整体即为b,原变量变为int  b()

最后,int b()即为函数

所以,原变量为函数指针数组。


注意:函数指针数组是一数组,数组每个元素存放函数指针,即存放函数的地址,所以可以很多函数集合在一数组中。

           每次调用一个函数,引用一次数组即可实现,因此,函数指针数组可被用作转移表,简化程序代码。


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

是一指针,该指针指向数组,数组每个元素为函数指针,即数组中存放函数的地址


例10:void (*(*pfun)[10])()

首先,在中间的()优先级最高,所以pfun先与*结合,形成指针,故,该变量即为指针。将(*pfun)看做一整体a

其次,原变量变为void (*a[10])(),由上述例9可知,void (*a[10])()为一函数指针数组

所以,原变量即为函数指针数组的指针。




二维数组函数指针参数是指将二维数组作为参数传递给函数,并且该函数的参数是一个函数指针函数指针指向函数指针变量,可以用来调用特定的函数。 以下是一个示例代码,演示了如何传递二维数组函数指针参数: ```c #include <stdio.h> // 函数指针类型定义 typedef void (*FuncPtr)(int, int); // 函数使用二维数组函数指针作为参数 void processArray(int arr[][3], int rows, int cols, FuncPtr func) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { // 调用函数指针指向函数 func(arr[i][j], i); } } } // 示例函数,打印数组元素的值和索引 void printElement(int value, int index) { printf("Element [%d][%d]: %d\n", index / 3, index % 3, value); } int main() { int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; // 调用 processArray 函数,并传递二维数组函数指针参数 processArray(arr, 2, 3, printElement); return 0; } ``` 在上述代码中,`processArray` 函数接受一个二维数组 `arr`,以及行数和列数作为参数,同时还接受一个函数指针 `func`。在 `processArray` 函数中,使用嵌套的循环遍历二维数组,并通过调用函数指针指向函数来处理数组元素。 在 `main` 函数中,定义了一个二维数组 `arr`,然后调用 `processArray` 函数,并将 `arr`、行数、列数以及 `printElement` 函数函数指针作为参数传递进去。`printElement` 函数用于打印数组元素的值和索引。 运行上述代码,会输出如下结果: ``` Element [0][0]: 1 Element [0][1]: 2 Element [0][2]: 3 Element [1][0]: 4 Element [1][1]: 5 Element [1][2]: 6 ``` 这样,我们就成功地将二维数组函数指针作为参数传递给了函数,并在函数内部进行了处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值