C语言题库--指针

1.请问下面的代码定义了什么

int (*(*funcs[4])(int (*)(int, int), int, int))(int, int);

分析:这是一行定义语句,C语言最难理解的便是其花样繁多的声明/定义。理解声明/定义语句的关键是抓住一条: C语言像调用一样声明变量,从变量名(函数本身也是变量,代表一段“逻辑”内存)出发,看变量经过怎样的操作(注意操作顺序),最终得到什么样类型的值。

回答:

1. 变量名funcs,可以进行[] 下标操作,说明funcs是一个数组;

2. funcs数组的元素可以被*解析,说明数组元素是指针,funcs是指针的构成的数组;

3. 指针指向的对象,可以进行()调用操作,说明指向的对象是函数,funcs是函数指针的构成的数组;

4. funcs数组的元素指向的函数,有三个参数:int(*)(int,int)、int、int,第一个参数是一个函数指针,它的参数是两个int变量,返回值是int型

5. funcs数组的元素指向的函数的返回值可被*解析,说明返回值是个指针,这个指针解析后又可以进行()函数调用,说明仍然是个函数指针

6. 返回的函数指针指向的函数,参数是2个int变量,返回结果是int

定义了一个有4个元素的数组,数组元素是函数指针,指向的函数以int(*)(int,int)、int、int为参数,返回是一个函数指针。

返回的函数指针以int int为参数,返回值是int


2.




A) char * (*fun1)( char * p1, char * p2);
B) char * *fun2( char * p1, char * p2);
C) char * fun3( char * p1, char * p2);

  

看看上面三个表达式分别是什么意思?
C)这很容易,fun3是函数名,p1,p2是参数,其类型为char *型,函数的返回值为char *类型。
B) 也很简单,与C)表达式相比,唯一不同的就是函数的返回值类型为char**,是个二级指针。
A) fun1是函数名吗?回忆一下前面讲解数组指针时的情形。我们说数组指针这么定义或许更清晰:


int (*)[ 10 ] p;

再看看A)表达式与这里何其相似!明白了吧。这里fun1不是什么函数名,而是一个指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指针。同样,我们把这个表达式改写一下:


char * (*)( char * p1, char * p2) fun1;
这样子是不是好看一些呢?只可惜编译器不这么想。


3.

解释以下含义

int a
int *a
int **a
int a[10]
int *a[10]
int (*a)[10]
int (*a)[]
int (**a)[]
int **a[10]

int (*a)(int);

int (*a[10])(int):

a)int a;表示一个内存空间,这个空间用来存放一个整数(int);


b) int* a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数的空间,即a)中提到的空间;


c) int**a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放指针的空间,并且指向的这个空间中的指针,指向一个整数。也简单的说,指向了一个b)中提到的空间;


d)int a[10];表示一个数组;


e)int *a[10] :数组指针。数组a里存放的是10个int型指针;

先找到声明符a,然后向右看,有[]说明a是个数组,再向左看,是int *,说明数组中的每个元素是int *。所以这是一个存放int指针的数组。


f) int (*a)[10] :a是指针,指向一个数组。此数组有10个int型元素;

表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个长度为10、类型为int的数组;和int**a的区别在于,++、+=1之后的结果不一样,其他用法基本相同。

先找到声明符a,被括号括着,先看括号内的(优先级高),然后向右看,没有,向左看,是*,说明a是个指针,什么指针?在看括号外面的,先向右看,有[] 是个数组,说明a是个指向数组的指针,再向左看,是int,说明数组的每个元素是int。所以,这是一个指向存放int的数组的指针。


g)

int **a[10] 先向右边看,a[10],数组,每个放地址指向一个地址,这个地址指向int数据


h)int (*a)(int);表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个函数,这个函数有一个类型为int的参数,并且函数的返回类型也是int。

i)int (*a[10])(int):从a符号开始。其右边是[10],说明a是个数组,其中存了十个元素。再看a的左边是一个*。说明数组中存的是指针。现在在看(*a[10])的右边是(int);说明所存的指针是指向有一个int形参的函数,现在看(*a[10])的左边是个int ,说明指向的函数的返回值为int 类型


4.

int *p[]和int (*p)[]的区别

前者是指针数组,后者是指向数组的指针。更详细地说。

前: 指针数组;是一个元素全为指针的数组.
后: 数组指针;可以直接理解是指针,只是这个指针类型不是int也不是char而是 int [4]类型的数组.(可以结合函数指针一并看看......)

int*p[4]p是一个指针数组,每一个指向一个int型的
int (*q)[4]q是一个指针,指向int[4]的数组。

定义涉及两个运算符:“*”(间接引用)、“[]”(下标),“[]”的优先级别大于“*”的优先级别。

  首先看int *p[4],“[]”的优先级别高,所以它首先是个大小为4的数组,即p[4];剩下的“int *”作为补充说明,即说明该数组的每一个元素为指向一个整型类型的指针。int *p[4]的存储结构如下:(存储方格横向排列或竖向排列没区别,只要按内存地址顺序排列就行,此处只是为画图方便)


  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值