C语言中的数组

一维数组

一维数组的创建和初始化

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

猜你喜欢

转载自blog.csdn.net/h___q/article/details/78740804