数组(1)
Suzhou 41 0
一维数组

数组是一组相同类型元素的集合。 数组创建方式:

type_t arr_name [const_n]
//type_t:数组元素类型。arr_name数组名。const_n常量表达式,指定数组大小。
int arr [10];

数组的初始化:在创建数组的同时给数组的内容一些合理初始值。 不完全初始化:

int arr[10] = {1,2,3}  //其余元素默认初始化为0

::: warning

int arr1[5] = {'a','b'};  //数组中只有a、b两个元素,其余默认初始化为0
int arr2[5] = "ab";  //数组中有a、b、\0、三个元素,其余默认初始化为0

上述两种的存储结果是一样的,只是方式不同。 :::


char arr [5] = {a,98};  

上述数组中的元素为a、b、\0,原因是98的ASCII码对应字母b。


char arr[] = "abcdefg";

上述数组没有指定大小,会根据输入内容自动确定数组大小,为元素个数加上“\0”。


sizeof和strlen
#include <stdio.h>
#include <string.h>

int main()
{
    char arr[] = "abcdefg";
    printf("sizeof(arr)=%d\n", sizeof(arr));
    printf("strlen(arr)=%d\n", strlen(arr));
    return 0;
}
sizeof(arr)=8
strlen(arr)=7

::: warning sizeof是运算符,是计算数组所占空间的大小(包括数组内元素和标识结尾的‘\0’),即n*1+1。 strlen是库函数,测量的是字符串的实际长度,以'\0'结束(不包括'\0'),即n。

strlen:只能针对字符串求长度 sizeof:计算变量、数组、类型的大小,单位是字节。 :::

#include <stdio.h>
#include <string.h>

int main()
{
    //char arr[] = "abcdefg";
    //printf("%d\n", sizeof(arr));
    //printf("%d\n", strlen(arr));
    char arr1[] = "abcde";
    char arr2[] = { 'a','b','c','d','e' };
    printf("sizeof(arr1)=%d\n", sizeof(arr1));
    printf("sizeof(arr2)=%d\n", sizeof(arr2));
    printf("strlen(arr1)=%d\n", strlen(arr1));
    printf("strlen(arr2)=%d\n", strlen(arr2));
     return 0;
}
sizeof(arr1)=6
sizeof(arr2)=5
strlen(arr1)=5
strlen(arr2)=34

上述代码中,数组arr1中元素为“a、b、c、d、e、\0”,数组arr2中元素为“a、b、c、d、e”。 可得sizeof(arr1)=6,sizeof(arr2)=5。 strlen计算从第一个元素到“\0”中间的元素个数,数组arr2在计算完“abcde”后没有遇到“\0”会继续向下寻找,因为数组arr2并没有指定数组大小,则strlen(arr2)的计算结果为随机值。


#include <stdio.h>

int main()
{
    char arr1[] = "abcde";
    char arr2[] = { 'a','b','c','d','e' };
    char arr3[10] = { 'a','b','c','d','e' };
     return 0;

数组(1)


数组的访问

打印数组中前3个元素:

#include <stdio.h>

int main()
{
    char arr[] = { 'a','b','c','d','e','f'};
    int i = 0;
    for (i; i < 3; i++)  
    {
        printf("%c", arr[i]);
    }
    return 0;
}
abc

计算字符型数组长度:

#include <stdio.h>
#include <string.h>

int main()
{
    char arr1[] = "abcdefg";
    int len = strlen(arr1);
    printf("%d\n", len);
    int n = 0;
    for (n; n < len; n++)
    {
        printf("%c", arr1[n]);
    }
    return 0;
}
7
abcdefg

计算整型数组长度:

#include <stdio.h>

int main()
{    
    int arr2[] = { 1,2,3,4,5,6,7,8,9 };
    int sz = sizeof(arr2) / sizeof(arr2[0]);
    printf("%d\n", sz);
    int n = 0;
    for (n; n < sz; n++)
    {
        printf("%d", arr2[n]);
    }
    return 0;
}
9
123456789

::: danger 数组元素写成""形式时,数组中包含“\0”。 数组元素写成{}形式时,数组中不包含“\0”。 使用strlen计算数组长度时,从首元素到“\0”为止,不包含“\0”。 使用sizeof计算数组长度时,包括数组内元素和标识结尾的‘\0’。 :::


一维数组的内存存储

打印数组中每一个元素在内存中的地址:

#include <stdio.h>

int main()
{
    int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    int i = 0;
    for (i; i < sz; i++)
    {
        printf("元素%d的地址为%p\n", i, &arr[i]);
    }
    return 0;
}
元素0的地址为0000000ACA2FF648
元素1的地址为0000000ACA2FF64C
元素2的地址为0000000ACA2FF650
元素3的地址为0000000ACA2FF654
元素4的地址为0000000ACA2FF658
元素5的地址为0000000ACA2FF65C
元素6的地址为0000000ACA2FF660
元素7的地址为0000000ACA2FF664
元素8的地址为0000000ACA2FF668
元素9的地址为0000000ACA2FF66C

由上述代码可得,数组中相邻元素在内存中的位置相差4(64位编译器中int类型占据4个字节),即数组在内存中连续存放。 数组(1)


二维数组

创建x行y列的二维数组:

int arr[x][y];
char arr[x][y];
double arr[x][y];
二维数组的初始化
  int arr[3][5] = { 1,2,3,4,5,6,7,8,9 };

数组(1) 由上可得二维数组的元素填充是先行后列,其余未赋值元素默认初始化为0。 二维数组可以指定初始化元素的位置:

int arr[3][5] = { {1,2,3,4},{5,6},7,8,9 };

数组(1)


二维数组可以不指定行数,通过元素的初始化确定元素的行数:

int arr[][5] = { {1,2,3,4},{5,6} };

数组(1) ::: warning 二维数组的行和列不能同时省略。 二维数组行可以省略,列不能省略。 :::


二维数组的使用

打印出二维数组:

#include <stdio.h>

int main()
{
    int arr[2][5] = { {1,2,3,4},{5,6} };
    int m = 0;
    for (m; m < 2; m++)
    {
        int n = 0;
        for (n; n < 5; n++)
        {
            printf("%d",arr[m][n]);
        }
        printf("\n");
    }
    return 0;
}
12340
56000

数组(1) ::: tip 二维数组和一维数组一样通过下标访问。 :::


二维数组的内存存储
#include <stdio.h>

int main()
{
    int arr[2][5] = { {1,2,3,4},{5,6} };
    int m = 0;
    for (m; m < 2; m++)
    {
        int n = 0;
        for (n; n < 5; n++)
        {
            printf("&arr[%d][%d]=%p\n",m,n,&arr[m][n]);
        }
    }
    return 0;
}
&arr[0][0]=0000004F8DCFF868
&arr[0][1]=0000004F8DCFF86C
&arr[0][2]=0000004F8DCFF870
&arr[0][3]=0000004F8DCFF874
&arr[0][4]=0000004F8DCFF878
&arr[1][0]=0000004F8DCFF87C
&arr[1][1]=0000004F8DCFF880
&arr[1][2]=0000004F8DCFF884
&arr[1][3]=0000004F8DCFF888
&arr[1][4]=0000004F8DCFF88C

数组(1) 由上图可知,二维数组中每一行的元素地址相差4个字节,第一行和第二行元素也相差4个字节。即二维数组在内存中也是连续存放的。二维数组本质是由一维数组组成的。

如下图,可以将二维数组以行拆分为多个一维数组,例如arr[0][n],n为二维数组列号,该一维数组的元素下标。 数组(1) ::: tip 访问数组中元素的方式是数组名+下标。 一维数组:arr+[n] 拆分后的二维数组:arr[m]+[n] :::

评论区

索引目录