1、一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
int (*p[10])(int);
首先,定义一个函数,这个函数有一个整型参数,并返回一个整型数:int fun(int);
然后,定义一个有10个指针的整型数组:int *p[10];
最后,使指针数组替换函数名,即得到想要的结果:int (*p[10])(int);
2、指针数组和数组的指针:点击打开链接(引用)
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。
下面到底哪个是数组指针,哪个是指针数组呢:
A)
int *p1[10];
B)
int (*p2)[10];
这里需要明白一个符号之间的优先级问题。
“[]”的优先级比“*”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为p1,int *修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含10 个指向int 类型数据的指针,即指针数组。至于p2 就更好理解了,在这里“()”的优先级比“[]”高,“*”号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针。我们可以借助下面的图加深理解:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdbool.h>
#define max(a, b) a >b ? a : b;
bool get(char **buf)
{
if((*buf = (char *)malloc(20)) == NULL)
return false;
strcpy(*buf, "zhaozhanwei");
printf("the buf is %s\n", *buf);
return true;
}
void get1(int *a)
{
*a = 10;
}
void main(int argc, char **argv)
{
int a;
bool b;
char *buff = NULL;
printf("the input is %d : %s\n", argc, argv[0]);
a = max(2, 3);
printf("a is %d\n", a);
//memset(buff, 0, 20);
b = get(&buff);
if(b == true)
printf("the buff is %s\n", buff);
else
printf("error\n");
get1(&a);
printf("a is %d\n", a);
}
第一点:通过实现宏定义实现比较大小,返回较大的值,其中用到了三元运算符 “?:”。
void main()
{
char **p,a[6][8];
p = a;
printf("\n");
}
编译,然后就会发现通不过,报错:错误 1 error C2440: “=”: 无法从“char [6][8]”转换为“char **”
在《C专家编程》10.3节的小启发里讲的很透彻:(以下这段文字及对比一定要认真分析!)
数组和指针参数是如何被编译器修改的?
“数组名被改写成一个指针参数”规则并不是递归定义的。数组的数组会被改写成“数组的指针”,而不是“指针的指针”:
实参 所匹配的形参
数组的数组 char c[8][10]; char (*)[10]; 数组指针
指针数组 char *c[10]; char **c; 指针的指针
数组指针(行指针) char (*c)[10]; char (*c)[10]; 不改变
指针的指针 char **c; char **c; 不改变