数组的定义,在C语言中很简单,他的思想属于一种同类数据的归类思想,同属归类模型,在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素。譬如在没有数据的归类前int a; int b; int c;这些我们需要人为的把他们三个独立的变量关联起来,这使得操作非常的局促。
于是C模型中定义了一个全新可以从一个指针高度控制这三个数据的方式,就是数组数据结构。这里可以理解为,数组的控制和指针有着相同的维度,但是不可以直接将数组和指针混为一谈,因为数组本身的数据结构和指针配合起来在后期的数据处理非常有用,因为指针和数组本身思想上有着显著的区别。为了能控制这三个变量,C模型将会把这三个变量连续的存放在连续的内存空间中,a的数据后即为b,b的数据后面即为c。这样你只需要同指针的维度控制a,即可控制a后面的数据,因为后面的数据长度C模型会默认取得和a一样的长度,因为你想把他们归为一类去操控他们。
int a[3]={1,2,3}int a=1;int b=2;int c=3;int *a_s=&a; // 取a的地址// a_s+1=&b 后的指针 存b的地址// a_s+2=&c 后的指针 存c的地址//a[0] 取到1 等同于 *(a_s+0) 因此 *a = a[0] 第一个元素地址//a[2] 取到3 等同于 *(a_s+2) 因此 *(a+2) = a[2] 指针后移2个元素的地址
C模型中自带了[]的定义后,即可代替手动的内存地址指引和内存空间的申请,这对开发的意图来说剩下了很多效率,如果你想手动从a开始归类,你需要先把a,b,c的内存连续的放在一块,这一点有时候并不好做。C语言给你变了个戏法,可以用a[]直接帮你干完数据连续存放。
普通数组的定义 在C语法中,[]这样的表示符号一般就是为了数组而诞生的,其实早些时候一些文献和文档有一个说法,就是数组和是指针之间的一些关联 譬如将[]视为一个 一级指针,[][]视为两个的二级指针,确实,在某种程度上本质性的控制上,数组和指针可以相互代替,但是还是那句话,C模型中的数组还是得和指针相对独立的区分开来,以便人在高级数据结构中更合理的处理数据,这两个分类各有其用。所以在我的理念里面我不希望在数组和指针混为一谈,以便高效的调控数据结构。数组的定义int a[]={1,2,3} 左边int 表示这个数组的元素统一为int 类型 右边{}包含了这个数组的元素个数,它里面存放的数据的类型都是一致的,这是数组数据类型独有的高级逻辑(至少再C语言中,数组中的元素类型都是一个类型的)这样让使用和加工数据结构的工作者更高效的处理数据类。如果只是用来单纯的指针和连续的指针快来存储数据,这可能会让数据变得更加复杂。譬如,当定义了 int a[]={1,2,3}后,我们需要整体的拿走a这个数据块,并且有好多类似的数据块要我们存放,我们就需要有二化一的思想,将a 整个数据块看成一个类,然后存放到新的数组中,于是就会是这样 元素类型 a_pro[]= {a,b,c,......},这里的元素类型先不直接声明,但是这个雏形表示,我们可以把a类型一样的数组们,也可以整理起来放到新的数组里面,通常可以用两种方式去声明定义,
第一种*,a_pro的元素都看成数组,也就是定义 a_pro 的元素都为数组,然后直接存放a,b,c…..这种定义一般直接定义,比如二维数组等高维数组都是数学模型的应用,定义成如下:int (a_pro[])[]={a,b,c,......}
但是这么定义会报错,你没有指定这个a_pro 里面数组的长度是多少,因为现在编译器知道了,你定义的数组他里面包含了别的数组,但是他不知道你里面包含的数组的长度,这是C所不允许的,他不允许你数组包含的元素数组的长度是不固定的。所以你需要再定义的时候直接声明子元素的长度。这里我们的a={1,2,3} 含有三个,所以int (a_pro[])[3]={a,b,c,......}
这样就可以定义成功,因为这里没有优先级的其他干扰,我们可以最终写成int a_pro[][3]={{1,2,3},{....}......}
第二种,直接把a,b,c….本身指针变量存放到a_pro 中,那么我们需要如下这么定义int* (a_pro[])={a,b,c,......}
没有优先级干扰,可以去掉括号,直接可以写成int* a_pro[]={a,b,c,......}
再第二种方法中,很容易出现奇怪的想法,为什么定义的元素类型是int 但是存放的时候不写?
` int a_pro[]={&a,&b,&c,……}<br />这里又涉及到C规划的另一类数据结构定义,就是数组的指针。C语言中有个特性,用**&**取高级数据结构的地址时,其值就是这个变量符号本身,也就是数组a[]的地址是&a,**&a的值 也为a 本身的地址值**。但是如果再定义中用到数组的**& **取值,C模型会判断你是在取数组的地址,我们知道数组是有长度的,那么当直接取出数组的地址时候,他的也要声明成指向数组的指针。而你直接 int* a_pro[]={&a,&b,&c,……}`时候,他会认定你外层定义的数组元素类型是 int 长度的指针元素,而你赋予它的是&a,是某个数组长度的指针元素。因此冲突了。
讲到了数组的指针,那就看看具体定义如何,我们可以初步想到,他的定义写法结构为
数组类型 *p_Array = &a
然后再把某个数组具体化为a数组,那么最终定义为int (*p_Array) [3]= &a 
这里拓展一下C语言奇妙的定义规则,其实简单的来说,你定义的类型,取决于中继独立变量,如果明显一点可以写括号作用独立出来。
总结 三种定义的逻辑区别int a_pro[][3]={{...},{},{},......} a_pro 是个(二维)数组,存放了n个元素为3 的int 类型的数组int* a_pro[]={a,b,c,......} a_pro是个数组,存放了n个指向int类型的指针int (*p_Array) [3]= &a p_Array 是个指针,指向一个有三个int 元素的数组
拓展:技巧,定义的变量本质是什么,最终看括号权限
char *p;char **p;char *p[];char **p[];char (*p)[n];char** (**p)[n];char**(**p[m])[n];char**(**(**p)[m])[n];
