一文看透C的各种指针声明

本文介绍了分析C语言中复杂指针声明的方法,强调了声明和使用时类型的对应性。通过示例解析了如int(*a)[10]等声明,解释了如何通过声明来理解变量、指针、数组和函数返回类型的组合。并提供了错误用法示例以帮助读者避免常见误区。
摘要由CSDN通过智能技术生成

指针声明分析

很多人无法理解C语言的各种指针声明的含义,比如为什么数组指针要声明成 int (*a)[10],本文分享了一种分析方法,有助于理解各种指针的声明语法(包括上面的例子),只有理解了,才能更好的应用。

核心思想

分析方法的核心思想:C语言的一个特点就是怎么声明怎么用,得到的值的类型就是声明时指明的类型,用几个例子说明

//假设有如下声明,且假设数据已经正确初始化,函数已经正确定义
int a;
int *a;
int a[10];
int *a[10];
int func();
int *func();
//于是,使用代码中,下面这些语句得到的都是声明时的int型数据
a;
*a;
a[0];
*a[0];
func();
*func();

方法举例

下面针对对不同的指针声明方式逐一分析

  1. 简单例子

    int f;    //一个整型变量
    int *f;   //一个指向整型的指针
    

    声明1:在使用代码中,f是个int值。
    声明2:同样,在使用代码中(*f)是个int值,即对f执行一次解引用就得到了int值,故 f是个指针,指向int型数据。

  2. 错误用法

    int* f,g;
    

    ⚠它并没有声明两个指针,f是int型指针,g是int型变量。

  3. 声明函数(初级)

    int func();
    int *func();
    

    声明1:在程序中,func()相当于一个int值,括号“()”表示func是可以被调用的,故func是个函数,返回int值。
    声明2:在程序中,*func()​相当于一个int值,因为func()的优先级高于*func,所以当程序中使用 *func() 时,实际会首先执行func(),然后这个整体解引用就能得到一个int值,故func是个函数,返回int型指针。

  4. 声明函数(高级)

    int (*func)();
    int *(*func)();
    

    声明1:还是把声明后面的一堆扔进“代码”中,因为(*func)()​相当于一个int值。根据优先级,实际会先执行*func​,其后的括号表示(*func)​这个整体能被调用,调用之后得到一个int值,故func是个指针,指向一个函数,这个函数返回int值。
    声明2:同上,程序中的*(*func)()​相当于一个int值。首先根据两个括号,*func​先被执行,且这个整体可以被调用,调用之后再进行一次解引用就得到一个int值,故func是个函数指针,它指向的函数返回一个指针,(被返回的)这个指针指向int型数据。

  5. 声明数组

    int arr[10];
    int *arr[10];
    int (*arr)[10];
    

    声明1:在程序中使用 arr[0] 将得到一个int型数据
    声明2:在程序中使用 *arr[0]​将得到一个int型数据,关键在执行过程,根据优先级,它的等价代码是 *(a[0])​,也就是说arr是个数组,对a[0]​解引用就能得到int型数据,故arr是个数组,arr的元素是指针,指向int型数据。
    声明3:同样扔到使用它的代码中,(*arr)[0]​是个int值,根据优先级,(*arr)​先被计算,其后的[0]表示*arr​这个整体可以取下标,且取了下标后得到int值,故arr是个数组指针(arr指向一个数组),数组的元素是int类型。

讨论

如果遇到了复杂的指针声明无法理解,不妨分享至评论区一起分析~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值