hello,各位老爷大家好,在华清学习了一段时间,今天我想总结一下数组,包括一维数组、二维数组、数组与指针的关系。言归正传进入今天的正题。
首先是数组
数组是用来存储多个同类型的数据,学好数组的两个关键,知道数组的元素类型和,元素个数,还有一点要铭记,不管是几维数组,单个数组再内存中储存都是连续存储的,数组的名字就是数组的首地址。
定义数组总体来说有两种定义方法:
1、定义的同时进行初始化 : int a[3]={1,2,3}; 或者 int a[ ]={1,3,2}; 前者定义的时候写出了元素的个数为3,后者把元素的个数省略了,其实省略的数字也是3(查大括号里面的元素个数)。
定义时部分初始化: int a[3]={1,2}; 省略个元素没写,默认为0,所以a数组俩面的元素为1,2,0。
2、定义之后再初始化:int a[3]; a[0]=1;a[1]=2;a[2]=3;
注意:定义之后再初始化,这种情况不能一定义,例:int a[3]; a[3]={1,2,3}//报错,定义之后,再定义,为涉及到元素里面存的是随机数。数组的下标是从0开始的,超过元素的个数,数组会越界,有可能会导致程序崩溃。
数组的遍历,举个小例子:
int a[4]={1,2,3,4},i;
for(i=0;i<4;i++)
{
printf("%d ",a[i]);
}
数组的遍历,下标是从0开始的,逐步的遍历。
数组的长度计算: 用sizeof()函数,也可以用数学方法来计算:元素的个数X元素类型的长度
下面是二维数组
先定义一个二维数组感受一下:int a[3][4]; 这就是个二维数组,首先数组要研究的九个点,元素类型,原元素个数。 上面这个数组元素类型维int整型,元素个数为(3x4)=12个。需要注意的一点是,二维数组的列的个数不能省略不写。
必要说的一点是,二维数组再内存中也是连续线性存储的。外面有的说法,说可以把二维数组当成一个阵列来看待,3为行4为列,没错,这个说法可以加深我们对二维数组的理解,但是本质不是这样,是一根线。
下面我讲一下二维数组的遍历:
int i,j,a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
首先定义了两个变量i,j代表二维数组的行列,这样从每行组个遍历输出,就可以了。
下面说个非常重要的点----------数组与指针
1、数组的名字就是该数组在内存当中的首地址(一维数组)
例子:int a[3]={0}; (这种定义方法是代表三个元素都为0) int* p=a; 这就相当与把数组a的首地址赋给了指针p。这样我就可以通过指针去间接改变数组里面的值。
int a[3]={0};
int * p=a;
p[0]=1;
p[1]=2;
p[3]=3;
这里我提一点:当指针p指向数组的首地址时则会有下面的两个等式成立
a[i]==p[i]==*(a+i)==*(p+i) a+i==p+i==&a[i]==&p[i];
2、二维数组
二维数组的指针与以为数组的不一样,二维数组在数学角度可以把其当成个由一维数组组成的数组。int a[3][4],可以理解成有3个int [4]无名的一维数构成。所以就有数组指针这个特殊的指针类型出现:int(*p)[4],这个是数组指针,名字叫p,指向的类型是int [4](一维数组),
int a[3][4]={0};
int(*p)[4]=a;
和一维数组一样,二维数组与指针也有类似的等式:
a[i][j]==p[i][j]=*(*(a+i)+j)==*(*(b+i)+j)
还有就是二维数组指针加1问题,每加 1,指针指向的位置向下移动一行。
好了,今天关于数组的分享总结就到这里结束了,中间有很多细节都没有涉及到,总的来说指针对于数组的作用就是为了在函数中用来传参和进行访问数组。数组指针针对二维数组来说才提出的一个概念。只要明白数组研究问题的本质,元素的类型和元素的个数,那么大多数的问题语法都迎刃而解。有什么问题或者文章写的有错的地方,请在评论区留言或者私信批评我。我这边会加以修改改正。欢迎来扰。
请各位老爷,点赞!!