数组是同种数据类型组成的集合,也可以说是同种数据类型变量的集合。数组是集合的一种,我们获取得到集合,就可以来操作集合中的变量。
数组的内存空间地址是连续的,数据类型必须都相同,如果不相同就不符合定义。
首先先定义一个数组。数组的初始化分为完全初始化和部分初始化以及不初始化
// 完全初始化
int a[5] = {1,2,3,4,5};
// 部分初始化
int b[5]= {1,2};
// 不初始化,不进行初始化,里面全部都是垃圾值。
int c[5];
就拿最后一个不初始化来举例子:
# include <stdio.h>
int main(void){
int a[4];
for(int i = 0;i<4;i++){
printf("对应的值是:%d\n",a[i]);
}
return 0;
}
下面进行正常的测试:
# include <stdio.h>
int main(void){
int a[4] = {1,2,3};
// int[3] b = {3,4,5};
printf("a对应的值是:%d\n",a);
printf("a[0]对应的值是:%d\n",a[0]);
printf("a[1]对应的值是:%d\n",a[1]);
printf("a[2]对应的值是:%d\n",a[2]);
printf("a[3]对应的值是:%d\n",a[3]);
printf("a[4]对应的值是:%d\n",a[4]);
return 0;
}
直接看控制台输出:
a对应的值是:6487568
a[0]对应的值是:1
a[1]对应的值是:2
a[2]对应的值是:3
a[3]对应的值是:0
a[4]对应的值是:10687360
--------------------------------
Process exited after 0.1377 seconds with return value 0
请按任意键继续. . .
问题1:a是什么?
这里有一个很诡异的现象,a输出的整型值是6487568,那么这个a是什么?
问题2:定义一个数组,长度是4,里面有4个元素,从下表0开始,a[0]、a[1]、a[2]、a[3]这四个元素,但是a[4]又是什么?
解决第一个问题:
a代表的是指向这个数组中第一个元素的地址,而不是这个地址里面存储的值。这个可以验证:
# include <stdio.h>
int main(void){
// 我这里只是给数组中的三个元素进行了赋值,而没有对后面的元素进行赋值,那么默认初始化就是0
int a[4] = {1,2,3};
// int[3] b = {3,4,5};
printf("a对应的值是:%d\n",a);
printf("a[0]对应的值是:%d\n",&a[0]);
return 0;
}
控制台输出:
a对应的值是:6487568
a[0]对应的值是:6487568
--------------------------------
Process exited after 0.1527 seconds with return value 0
请按任意键继续. . .
对a[0]取地址,可以看到a[0]当前所处的内存空间的地址值和a是一样的,那么就是说a和a[0]的地址是同一块空间。
解决第二个问题:
a[4]是什么?首先在分配内存的时候,OS只分配了一个数据,长度是4,元素只有:a[0]、a[1]、a[3]、a[3]这四个元素,对于a[4]来说,看看下面的实验:
# include <stdio.h>
int main(void){
int a[4] = {1,2,3};
// int[3] b = {3,4,5};
printf("a对应的值是:%d\n",a);
printf("a[0]对应的值是:%d\n",&a[0]);
printf("a[1]对应的值是:%d\n",&a[1]);
printf("a[2]对应的值是:%d\n",&a[2]);
printf("a[3]对应的值是:%d\n",&a[3]);
printf("a[4]对应的值是:%d\n",&a[4]);
printf("a[4]对应的值是:%d\n",a[4]);
return 0;
}
控制台输出:
a对应的值是:6487568
a[0]对应的值是:6487568
a[1]对应的值是:6487572
a[2]对应的值是:6487576
a[3]对应的值是:6487580
a[4]对应的值是:6487584
a[4]对应的值是:1774464
--------------------------------
Process exited after 0.1567 seconds with return value 0
请按任意键继续. . .
可以惊奇的发现,原来地址也是对应的+数据类型所占用的字节数。但是a[4]这块内存空间尽管存在,但是对应的是垃圾值,而不是默认值。
因为这块空间不属于数组的,所以这里没有进行初始化。
# include <stdio.h>
int main(void){
int a[4];
a[4]= {1,2,3};
return 0;
}
编译都不会通过,因为首先进行了数组的声明定义,然后再进行赋值的时候,发现没有a[4],也可以说a[4]对应的内存空间里存放的是垃圾值。
数组中根本就不存在着a[4],更何况是赋值:
# include <stdio.h>
int main(void){
int a[4];
a[4]= 2;
printf("a[4]对应的值是:%d\n",a[4]);
return 0;
}
控制台直接输出错误,这里和上面对比,可以发现,如果在声明的时候进行了初始化,输出a[4]不会出现问题,但是先声明后赋值,就出现了问题。
所以从这里可以看出来,数组在C语言中就已经知道了数组的长度,因为在定义的时候就已经指明了。
最经典的一种方式就是数组进行赋值,如:将数组a赋值给数组b,也就是说将a数组中的值都赋值给b数组中的元素;
# include <stdio.h>
int main(void){
int a[4] ={1,2};
int b[] = {};
b = a;
for(int i = 0; i<4;i++){
printf("b中元素的值是:%d\n",b[i]);
}
return 0;
}
编译不会通过,那么使用下一个方式:
# include <stdio.h>
int main(void){
int a[4] ={1,2};
int b[] = {};
// b = a;
for(int i = 0; i<4;i++){
b[i] = a[i];
printf("b中元素的值是:%d\n",b[i]);
}
return 0;
}
查看控制台输出
b中元素的值是:1
b中元素的值是:2
b中元素的值是:0
b中元素的值是:0
--------------------------------
Process exited after 0.4152 seconds with return value 0
请按任意键继续. . .
赋值成功。
数组中的操作:添加、删除、移动、遍历、最值问题,但是其他语言实现的时候,都会有对应的工具包来进行操作这些数组。我们只需要来操作这些工具类即可来进行操作数组了。
先甩出来一个二维数组:int a【3】【4】,那么对应的数据就有3*4=12个,有十二个数据
a[0][0] a[0][1] a[0][2] a[][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]
a[3][0] a[3][1] a[3][2] a[3][3]
所以从上面观察可以看出来,a【m】【n】代表的是第(m+1)行第(n+1)列的值;
那么int a【m】【n】这个定义说明了,二维数组的最后一个值是a【m-1】【n-1】
二维数组的空间结构:
我觉得就是一个一维数组中嵌套了一个一维数组,行或者是列中存储的是一个数组的首地址的值。
二维数组的初始化:
int a[3][4]={1,2,3,4,5,6};
int b[2][3]={
{1,2,3},
{4,5,6},
{7,8,9},
};
原文:https://www.cnblogs.com/likeguang/p/15104787.html