C/C++复杂指针变量的声明如何解读

1. 指针

指针也就是内存地址,指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。

2.定义一个简单指针

int *p; // 代表这是指向int 的指针p,在该地址内存放的数据类型为整型int。
int * func(int i,int j); //func是一个函数表示函数的返回值为int *
int (*func) (int a, int b);// func是一个函数指针,指向的函数的参数时两个整型a,b,返回值类型为int

3. 运算符优先级

对于复杂指针变量的声明的解读需要知道以下几个运算符优先级的顺序, 如果知道了这个顺序那么对于解读复杂声明时会有很大帮助。

正常的同级的运算顺序是从左往右进行运算;
即a+b+c+d+f;先+a再+b依次类推,
如果高一级那么先算高一级的运算符在算低一级的
即a+b/c先算b/c再算a和b/c的商的和

() > [] >*

4.实战

int *p; 指针变量指向一个地址,存储的是一个整型变量

int *(p[4])  数组加了一个指针,等同于int *p[4]  表示数组中元素是指针类型,这是由于[]的优先级高于*所以p先于[]结合再和*结合


int (*p)[5] 这是一个指向了一维数组,元素是int类型

int (*func)(int *p);
先计算()括号内是一个指针,所以func 是一个指针,跳出括号后旁边又是一个括号说明该指针指向的是一个函数,这是一个函数指针,所以这个定义的是一个函数指针,参数是一个指针,为int*。

int (*func)(int *p, int (*f)(int*));
func被一对括号包含,且左边有一个*号,说明func是一个指针,跳出括号,右边也有个括号,那么func是一个指向函数的指针,这类函数具有int *和int (*)(int*)这样的形参,返回值为int类型。再来看一看func的形参int (*f)(int*),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为int。

int (*func[5])(int *p);
func右边是一个[]运算符,说明func是一个具有5个元素的数组,func的左边有一个*,说明func的元素是指针,要注意这里的*不是修饰func的,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合,因此*修饰的是func[5]。跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。


int (*(*func)[5])(int *p);
func被一个圆括号包含,左边又有一个*,那么func是一个指针,跳出括号,右边是一个[]运算符号,说明func是一个指向数组的指针,现在往左看,左边有一个*号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。

int (*(*func)(int *p))[5];
func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。

要注意有些复杂指针声明是非法的,例如:
int func(void) [5];
func是一个返回值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组,这是因为如果允许函数返回值为数组,那么接收这个数组的内容的东西,也必须是一个数组,但C语言的数组名是一个右值,它不能作为左值来接收另一个数组,因此函数返回值不能为数组。

int func[5](void);
func是一个具有5个元素的数组,这个数组的元素都是函数。这也是非法的,因为数组的元素除了类型必须一样外,每个元素所占用的内存空间也必须相同,显然函数是无法达到这个要求的,即使函数的类型一样,但函数所占用的空间通常是不相同的。
// 练习
int (*(*func)[5][6])[7][8];

typedef part (*func)[5][6] int(* part)[7][8] func是一个指针指向[5][6]的二维数组,每个元素都是一个指针,指向[7][8]的二维数组,这个数组的元素类型为int。


int (*(*(*func)(int *))[5])(int *);
typedef part (*func)(int *)  

func函数指针参数时整型指针,返回值是一个指针指向数组,元素个数为5,数组元素是函数指针,参数时int * 返回值int。

int (*(*func[7][8][9])(int*))[5];
func 是一个三维数组[7][8][9],每个元素都是一个函数指针参数为整型指针,返回值为一个指针指向一个数组,数组元素类型为int,个数为5。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值