指针声明分析
很多人无法理解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();
方法举例
下面针对对不同的指针声明方式逐一分析
-
简单例子
int f; //一个整型变量 int *f; //一个指向整型的指针
声明1:在使用代码中,f是个int值。
声明2:同样,在使用代码中(*f)是个int值,即对f执行一次解引用就得到了int值,故 f是个指针,指向int型数据。 -
错误用法
int* f,g;
⚠它并没有声明两个指针,f是int型指针,g是int型变量。
-
声明函数(初级)
int func(); int *func();
声明1:在程序中,func()相当于一个int值,括号“()”表示func是可以被调用的,故func是个函数,返回int值。
声明2:在程序中,*func()
相当于一个int值,因为func()的优先级高于*func,所以当程序中使用 *func() 时,实际会首先执行func(),然后这个整体解引用就能得到一个int值,故func是个函数,返回int型指针。 -
声明函数(高级)
int (*func)(); int *(*func)();
声明1:还是把声明后面的一堆扔进“代码”中,因为
(*func)()
相当于一个int值。根据优先级,实际会先执行*func
,其后的括号表示(*func)
这个整体能被调用,调用之后得到一个int值,故func是个指针,指向一个函数,这个函数返回int值。
声明2:同上,程序中的*(*func)()
相当于一个int值。首先根据两个括号,*func
先被执行,且这个整体可以被调用,调用之后再进行一次解引用就得到一个int值,故func是个函数指针,它指向的函数返回一个指针,(被返回的)这个指针指向int型数据。 -
声明数组
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类型。
讨论
如果遇到了复杂的指针声明无法理解,不妨分享至评论区一起分析~