指针篇之四 借你一双慧眼,把它类型看个清楚明白

本文介绍了一种简单的方法来理解C/C++中复杂的指针定义,包括指针数组与指向数组的指针的区别,以及返回指针型的函数与指向函数的指针的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该文章转载于http://blog.youkuaiyun.com/ipmux/article/details/17206457,感谢博主悉心讲解。

指针可以指向各种内存元素类型,因而存在变化多样的语法定义,靠死记硬背难以分辨,特别是一些复杂及嵌套定义。要弄清指针到底指向什么类型的内存变量,有个小窍门:把指针声明中的指针变量名和之前的指针声明符*去掉,剩下的就是指针所指内存的类型。比如:

    int *ptr;   //去掉 *ptr,指针所指内存的类型是int

    char *ptr;  //指针所指向的内存类型是char

    int **ptr;  //指针所指内存的类型是 int *

    ……

    不过也存在个别表达形式难以直接套用,比如:

    1)指针数组与指向数组的指针:

    int *ptr[3]; //指针数组

    int (*ptr)[3]; //指向数组的指针

    2)返回指针型的函数与指向函数的指针

    int* fun1(char*,int);   //定义函数fun1,其返回值为指向int类型的指针

    int (*pfun1)(char*,int); //定义指针pfun,指向某函数,函数返回int

    要区分这两种情况,只要记住:*号优先级等同于函数定义的()和数组下标的[],如果表达式中它们同时出现且没有额外()影响,遵循由右向左结合的原则。

    比如对int *ptr[3],由右向左,它首先是一个数组,剩下的int *ptr说明数组元素是指针型,因此它整体是一个指针数组。而对int(*ptr)[3],受额外的()括号影响,*ptr先结合,所以它首先是一个指针,剩下的int [3]代表数组,所以它是指向数组的指针。

    同样表达式int *fun1()中,*()处于同样优先级,由右向左首先是函数,然后返回值为int *。而int (*pfun1)()中,受第一个额外的括号影响,*pfun1先结合,首先是一个指针,剩下int ()代表返回值为int型的函数,因而整体是一个指向函数的指针。

    掌握这个小窍门,就基本不必为辨别各种指针定义形式而烦恼了。至于更加稀奇古怪的形式,这辈子真有幸碰到的话,google一下也就可以,没必要细究了。指针是人自己定义的工具,不是科研对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值