如何理解int *(*a[5])(int, char*);

int *(*a[5])(int, char*);  
拆开来分析:
typedef int* (*f)(int,char*);
f a[5];

所以a是个5个元素的数组,每个元素为函数指针.

可用代码验证:

#include <stdio.h>
#include <stdlib.h>

int* (*a[5])(int,char*);

int *foo(int n, char *s)
{
	int *p;

	p = (int *)malloc(sizeof(int));
	*p = n + atoi(s);

	return p;
}

int main(int argc, char *argv[])
{
	int *p;

	a[0] = &foo;
	p = (*a[0])(1, "2");

	printf("%d\n", *p);

	return 0;
}

输出:

3

顺便把函数指针再复习一下:

#include <stdio.h>
#include <stdlib.h>

//int* (*a[5])(int,char*);

typedef int (*f)(int,char*);
f funp;

int foo(int n, char *s)
{
	return 10086;
}

int main(int argc, char *argv[])
{
	funp = &foo;

	printf("%x\n",funp);
	printf("%d\n",(*funp)(6,"test"));

	return 0;
}

输出:

3f1000
10086

时间: 2024-10-04 19:46:50

如何理解int *(*a[5])(int, char*);的相关文章

c语言-C 中将一个int型数赋值给char型数组的前4字节,数组后面仍为char型

问题描述 C 中将一个int型数赋值给char型数组的前4字节,数组后面仍为char型 C 中将一个int型数赋值给char型数组的前4字节,数组后面仍为char型 解决方案 最简单的是使用联合 union X { int val; char[100]; } X.val=1; http://blog.csdn.net/jiangnanyouzi/article/details/3158702 解决方案二: http://www.jb51.net/article/56009.htmhttp://v

const int *p和int * const p的区别(常量指针与指向常量的指针) .

  对于指针和常量,有以下三种形式都是正确的: const char * myPtr = &char_A;//指向常量的指针 char * const myPtr = &char_A;//常量的指针 const char * const myPtr = &char_A;//指向常量的常量指针 下面依次对这三种类型进行介绍. 因为*操作符是左操作符,左操作符的优先级是从右到左,对于 1.常量指针(Constant Pointers) int * const p 先看const再看*

深入const int *p与int * const p的区别详解(常量指针与指向常量的指针)_C 语言

对于指针和常量,有以下三种形式都是正确的: 复制代码 代码如下: const char * myPtr = &char_A;//指向常量的指针char * const myPtr = &char_A;//常量的指针const char * const myPtr = &char_A;//指向常量的常量指针 下面依次对这三种类型进行介绍.因为*操作符是左操作符,左操作符的优先级是从右到左,对于1.常量指针(Constant Pointers) 复制代码 代码如下: int * con

浅析int*p[ ]与int(*p)[ ]的区别

以下是对int*p[ ]与int(*p)[ ]的区别进行了详细的分析介绍,需要的朋友可以参考下   举例说明:1)int* p[2] 是一个指向int型的指针数组,即:p是包含两个元素的指针数组,指针指向的是int型.可以这样来用: 复制代码 代码如下: <SPAN style="BACKGROUND-COLOR: rgb(255,255,255)">#include <iostream> using namespace std; int main(int ar

c++-c#中数组可以直接部分赋值吗??int[] a=new int[5]={1,2}这样写报错

问题描述 c#中数组可以直接部分赋值吗??int[] a=new int[5]={1,2}这样写报错 c#中数组可以直接部分赋值吗??int[] a=new int[5]={1,2}这样写报错,有什么方法可以实现,这样不行,有什么方法可以实现,c++中可以,C#却不行,头有点大,c++很多余C#不同 解决方案 int[] a = new int[] { 1, 2 }.Concat(Enumerable.Repeat(0, 3)).ToArray(); 解决方案二: 作为特例,字符串可以 char

浅析int*p[ ]与int(*p)[ ]的区别_C 语言

举例说明:1)int* p[2] 是一个指向int型的指针数组,即:p是包含两个元素的指针数组,指针指向的是int型.可以这样来用: 复制代码 代码如下: <SPAN style="BACKGROUND-COLOR: rgb(255,255,255)">#include <iostream>using namespace std;int main(int argc, char* argv[]) {int* p[2];int a[3] = {1, 2, 3};in

深入解析int(*p)[]和int(**p)[]

以下是对int(*p)[]和int(**p)[]的使用进行了详细的分析介绍,需要的朋友可以参考下   1. int(*p)[10]:根据运算符的结合律,()的优先级最高,所以p是一个指针,指向的一个维度为10的一维数组. p一个指向数组的某一行 复制代码 代码如下: int a[1][4]={1,2,3,4};     int (*p)[4] = a;//p point to the row of array a     for(int i=0;i<4;i++)     {      cout<

mysql中int(1)和int(11)区别详解

mysql字段定义中INT(x)中的x仅仅指的是显示宽度.该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度.显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示.所以x的定义与存储空间没有任何关系都是4个字节. 作为SQL标准的扩展,MySQL也支持整数类型TINYINT.MEDIUMINT和BIGINT.下面的表显示了需要的每个整数类型的存储和范围. 类型 字节 最小值 最大值     (带符号的/无符号的) (带符号的/无符号的) TINYINT 1

java-为什么new int[4]== new int[4]的boolean值为flase

问题描述 为什么new int[4]== new int[4]的boolean值为flase 如题为什么new int[4]== new int[4]的boolean值为flase............................................................... 解决方案 这个比较的是两次new int[4]的地址,比较的是地址啊... 当然会不一样了 解决方案二: int [][]a=new int[4][4] 解决方案三: 因为是不同地址呀,new