C语言中的数组

来源:互联网 发布:企业汉字做域名的品牌 编辑:程序博客网 时间:2024/06/05 20:06

一维数组

一维数组的创建和初始化

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.&数组名(数组名表示整个数组),取出的是整个数组的地址。
除此之外,所有的数组名都表示数组首元素的地址。

原创粉丝点击