C语言中的运算符优先级

这个是我们最容易忽视的一个地方,因为今天做了几个笔试题,感觉这个很重要,能很好的帮助我们记忆数组指针,指针数组,函数指针和指针函数,下面我总结了一些总结的小技巧,是为了应付笔试╭(╯^╰)╮。


—————————————————————————————————————————————————————————————————————————————

首先我还是贴一下网上找的笔试题吧:

1.int (*s[10])(int) 表示的是什么?

  答案:int (*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。

我的理解:想做对这个题目就是考你的优先级掌握情况, [ ]高于* 所以 *s[10]是指针数组(本质是数组),这个时候我们把 s[10] 当做一个变量a (方便我们理解) 再来看这个式子:int (*a) (int) 这个就是函数指针(本质是指针),最后再看一下,展开,就是函数指针数组。这里有一个小技巧,最先结合的本质就是什么,名字也会放在最后面。 再来理一下思路:[ ]最先结合,*其次,最后后面接了一个参数说明是函数,那么读起来就要反过来:函数指针数组! 


指针函数:本质是函数
int * func()  赋值:int *a; a=func();
函数指针:本质是指针
int (*func)()  赋值:int f (); func=f;

#include <stdio.h>
int pri(void)
  {
      printf("lzj\n");
  } 
  void main()
  { int (*func)();
    func=pri;
    (*func)();
  }

数组指针:本质是指针
int (*p)[4]  赋值:int a[x][4]; p=a;  x为1,2,3...
指针数组:本质是数组
int * p[4]  赋值:int *a ; a=p;


2.在物理内存0x30008000地址存放一个入口函数,他的返回值类型为int,无输入参数。如果想跳到0x30008000去运行这个函数,该怎么办?

  答案:   *((int (*) ()) 0x30008000)()

我的理解:题目说了返回值是int,我们就要把它强制类型转化为一个函数指针int (*)() -->( int (*)( ) )0x30008000 然后再去调用即可用*去调用它。

这里我们还是可以看到优先级的问题,它是先和*结合,说明是一个指针,然后后面接了参数,说明是函数,那么就是一个函数指针。

============================================================================================

其实我们的函数可以拆分来看:int a  ()    前面是返回类型,中间是函数名,也就是函数的入口地址,后面是形参

int * a ()  这里可以看出()优先级高,而且顺序也是左到右,所以a是一个函数,该函数的入口地址就是它本身,返回的是一个地址.

int (*a) () 这里把a 和*括在一起了,函数的入口地址是一个指针的地址,说明a本身指针,里面存放的是函数的返回类型是int,形参是()里面的一个函数地址

============================================================================================


3.用变量a给出下面的定义

a) 一个整型数(An integer) 

b) 一个指向整型数的指针(A pointer to an integer) 

c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer) 

d) 一个有10个整型数的数组(An array of 10 integers) 

e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers) 

f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers) 

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer) 

h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数 An array of ten pointers to functions that take an integer argument and return an integer ) 

答案: 

 a) int a; 

b) int *a;  

c) int **a;  

e) int *a[10]; 

 f) int (*a)[10];  

g) int (*a)(int);  

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

解析:这个就按我的那个方法来判断的话就很容易了,这里需要提醒的是函数是有返回类型,而其他普通的变量没有,所以前面的int理解有所不同。

—————————————————————————————————————————————————————————————

最后贴一下运算符优先级顺序表:特别是&,它取地址和与运输的时候优先级不一样。

优先级
运算符
名称或含义
使用形式
结合方向
说明
1
[]
数组下标
数组名[整型表达式]
左到右
 
()
圆括号
(表达式)/函数名(形参表)
 
.
成员选择(对象)
对象.成员名
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值