高级指针类型判断

Q. 解释下列声明的含义
1.int *x[10]    2.int (*x)[10]        3.int (*x[10])(int)        4.int (*x)(int)
A.以上各个声明含义如下
1.一个含有10个指针的数组,每个指针指向一个int类型数(declare x as array 10 of pointer to int)
2.一个指针,指向含有10个int类型的数组(declare x as pointer to array 10 of int)
3.一个含有10个指针的数组,每个指针指向传入参数为int返回参数为int的函数(declare x as array 10 of pointer to function (int) returning int)
4.一个指针,指向传入参数为int返回参数为int的函数(declare x as pointer to function (int) returning int)

---------------------------------------------------换行符----------------------------------------------------------------------------------------
相信做过C语言笔试、面试题目的对以上题目都不陌生,这些类型相较于普通简单的指针类型判断起来复杂许多,《C和指针》这本书对这些高级指针用法有详细描述和解释,那么具体是怎么判断的呢
M.判断方法
1) 使用命令
假如你不是在笔试或面试,遇到复杂类型,不知道具体含义,那么可以直接用linux的一个命令,可以实现解释这个翻译,名字为cdecl,如没有安装即可
cdecl> explain int (*f[10])[10]
declare f as array 10 of pointer to array 10 of int
2) 根据C优先级来判断
C语言优先级见百度百科,其基本原则如下
a. 优先级从上到下依次递减,逗号优先级最低
b. 同一优先级,按照结合顺序计算
c. 大多数运算从左向右结合,只有三个例外:单目运算符、条件运算符、赋值运算符
    单目运算符 - 只有一个操作数,比如++、--、-、*、&、(int)
    条件运算符 - 仅一个?:
    赋值运算符 - =、*=、&=、<<=等

使用此原则判断如下
1. int *x[10] -> []优先级高于* -> 先运算[10],表示含有10个元素的数组 -> 每一个元素都是int *类型 -> x为10个指针组成的数组,该指针指向int类型 -> 赋值示例:
int a1 = 1, a2 = 2, a3 = 3, a4 = 4;
int *b[4] = {&a1, &a2, &a3, &a4};
2. int (*x)[10] -> []和()优先级同为1,结合性从左向右 -> 先运算(*x),表示一个指针 -> 这个指针指向含有10个int类型的数组 -> x为指针,指向含有10个int类型的数组 -> 赋值示例:
int a[5] = {0};
int (*b)[5] = &a;
3. int (*x[10])(int) -> 两个括号优先级相同,因此先第一个(*x[10]) -> *x[10],由于[]优先级高于* -> 先运算[10],表示含有10个元素的数组 -> 每一个元素都是int (*)(int)类型 -> x为10个指针组成的数组,每一个指针都指向传入参数为int参数返回参数int的函数 -> 赋值示例:
int a1(int val1){return val1;}
int a2(int val2){return val2;}
int a3(int val3){return val3;}
int a4(int val4){return val4;}
由于函数名代表函数地址,因此a1和&a1意义相同
int (*b1[4])(int) = {&a1, &a2, &a3, &a4};
int (*b2[4])(int) = {a1, a2, a3, a4}
4. int (*x)(int) -> 两个括号优先级相同,因此先第一个(*x) -> *x表示一个指针 -> 指向int (*)(int)类型 -> x为一个指针,指向传入参数为int返回参数为int的函数 -> 赋值示例:
int a(int val){return val;}
int (*b1)(int) = a;
int (*b2)(int) = &a;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值