一维数组
一维数组的创建和初始化
int main()
{
int arr[5]={0};//创建一个包含有五个元素的整型数组,并将首元素初始化为0
int arr[]={0};//当不确定数组的元素个数时,[]里面可以不用写具体的值
}
错误的例子
int main()
{
const int n = 10;
int arr[n];//这样来创建一个一维数组是错误的,[]里面必须是一个常量
return 0;
}
数组创建好之后,数组名代表数组首元素的地址。
数组的越界访问
int main()
{
int i=0;//在内存中,由于i先创建,i一定会存放在高地址处
int arr[4]={0};//相对i位于低地址处
for(i=0;i<=6;i++)
{
arr[i]=0;
}
return 0;
}
//由于数组的越界访问,这个程序会无限的循环下去
//是因为随着数组下标的增长,会越界访问到i所在的空间,继而不断改变i的值
VS编译器会在i所在内存与arr[4]所在内存间隔两个内存空间(类型与数组一致)。
在Linux环境下,i所在空间与arr[4]所在空间间隔1个内存空间。
在早期的编译器中,i所在空间与arr[4]所在空间是相邻存放的。
一维数组在内存中的存放
调试下面的程序并且查看数组arr的地址
&arr:
&arr[0]:
&arr[1]:
&arr[2]:
&arr[3]:
因为定义的数组类型为整型,所以每个元素之间的地址相隔4,所以一维数组在内存中是相邻存放的。
int arr[] = {0};
int i = 0;
int *p = arr;
*(p+i) = arr[i];
//arr[i]=*(arr+i)=*(p+i)=i[arr]
二维数组
二维数组的创建与初始化
int main()
{
int arr[3][4]={0};//3表示行数,4表示列数
int arr1[3][4]={1,2,3,4,5};//按顺序存放,第一行存1 2 3 4,5存在第二行
int arr2[3][4]={{1,2,3},{4,5}};//1 2 3存在第一行,4 5存在第二行
int arr3[][常量]={0};//行数可以省略,列数不可以省略
return 0;
]
二维数组的数组名表示首行首元素的地址,它表示整个数组的的地址。
二维数组名+[行号]表示二维数组中该行首元素的地址,它表示二维数组中的这一整行。
二维数组名+[行号]+[列号]表示二位数组中该元素的地址,它表示二维数组中的一个元素。
二维数组在内存中的存放
二维数组在内存中是连续存放的。
运行并调试下面的程序
&arr:
&arr[0]:
&arr[1]:
&arr[2]:
可以看出二维数组每行的首元素之间相隔12个字节,整形数组每个元素的大小为4字节,所以容易得到二维数组在内存中是连续存放的。
int main()
{
int arr[3][4]={0};
return 0;
}
sizeof( )
1.当数组名单独放在sizeof()内时,表示整个数组。
2.&数组名(数组名表示整个数组),取出的是整个数组的地址。
除此之外,所有的数组名都表示数组首元素的地址。