c语言中(*a)[n]与*a[n]有什么区别

c语言中(*a)[n]与*a[n]有什么区别

表面上看这些问题,好像是指针,但是,如何来正确判断这几个定义,需要我们首先有运算符优先级的概念。

在c语言中,[] 和 () 的优先级比星号(星号的名字叫做“指针运算符”)要高,所以,在这几个声明中,先看 [] 和 () 。
同时,这两个括号的运算符的结合顺序,是从左到右的。因此,int *a[n],实际上相当与int *(a[n]),也就是(int *)(a[n])。

让我们来逐步分析:

ElementType *a[n] :

(int *)(a[n]) 首先是一个数组(比如,把 int * 换为 int,就是“元素是整形数据的数组”。那么,换为 int*,就是“元素是指向整形数据的数组的指针”简而言之就是 指向数组的指针 )。

ElementType(*a)[n] (记忆法-括2维):

int (*a)[n] 改变了自然的运算符的优先级,相当于(int)((*a)[n])。一有指针就头疼,我们把指针先用b替换掉,就是int b[n],是一个n位数组,数组首地址(也就是数组名)是b。
那么,int (*a)[n]也是一个n位数组,但是这个数组的首地址是*a(这里的*是间指运算符),也就是说,*a的内容,是一个数组的首地址。
那么,a的内容是一个存放数组首地址的地址,这个数组中的元素都是int。实际上,a相当于是一个二维指针