前言:
对于指针:定义指针时,要明确指针的类型和指针指向的类型。
指针的类型:直接去掉变量名,剩下的就是指针的类型。
指针指向的类型:去掉变量名后,在去掉一个 ,
对于数组:同理,定义一个指针指向一个数组时,首先应该明确数组类型及数组元素的类型。
数组的类型:直接去掉数组名,剩下的就是数组的类型
数组元素的类型:去掉数组名后,再去掉一个方括号[ ],剩下的就是数组元素的类型。*
例:int arr[2][3][5];定义指针指向该数组,该如何定义
对于多维数组而言,其本质就是数组的元素也是数组(俄罗斯套娃儿~),因此,我们将数组拆开,一层一层的来看如何定义指针
首先,数组的类型为int [2][3][5],由于定义一个指针指向数组,那么我们只要知道指针所指向的数组元素的类型,即可定义指针。
对于int arr[2][3][5],按照上述方法,对于第一层,arr[2](把后面省略的[3][5]当成是数组元素,暂且不把他看成数组,即我的眼里只有[2]是主角,其他的都要依赖于我),我们可知数组有两个元素,且每个元素的类型如下:
因此,定义指针类型为:int (*p)[3][5] = arr;
对于第二层,arr[2][3](忽略[5]),由于多维数组的本质是数组套数组,则我们可以知道首先数组有两个元素,其次,数组的每个元素又包含三个元素,则每个元素的类型如下:
因此,定义指针类型为:int (*p)[5] = arr[i];(i = 0,1)(和int (*p)[5] = &arr[i][0]的意思相同)
这里为什么是arr[i]呢?
在上面我们提到,数组名表示的是数组第一个元素的地址,那么此时我们将arr[i]看成是数组名,则arr[i]实际上表示的是一个地址(前提是arr[i]里的元素也是数组,此时arr[i]表示的就是第一个元素的地址:例如:int arrtest[3][4],则arrtest[0]就等效于 arrtest[0] == &arrtest[0][0],arrtest[1] == &arrtest[1][0],arrtest[2] == &arrtest[2][0])
对于第三层,arr[2][3][5],我们可以知道数组中每一个元素的类型都是int,则每个元素的类型如下:
因此,定义指针类型为:int *p= arr[i][j];(i = 0,1;j=0,1,2,)(int *p = &arr[i][j][0]的意思相同)
同理,arr[2][3][5]里面的就是整形数了,有 int t = arr[i][j][k];(i=0,1;j=0,1,2;k=0,1,2,3,4),就是对整形数赋值。