Bootstrap

初识数组(二)

目录

1. 二维数组的初始化

1) 不完全初始化

2) 完全初始化

3) 按照行初始化

4) 初始化时省略行,但是不能省略列

2.二维数组的使用

1) 二维数组的下标

2)二维数组的输入和输出

3. 二维数组在内存中的存储

4. C99中的变长数组

5. 数组练习

1)多个字符从两端移动,向中间汇聚

2)二分查找


1. 二维数组的初始化
1) 不完全初始化
int arr1[3][5] = {1,2};
int arr2[3][5] = {0};

2) 完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 1 3,4,5,6,7};

3) 按照行初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};

4) 初始化时省略行,但是不能省略列
int arr5[][5] = {1,2,3};
int arr6[][5] = {1,2,3,4,5,6,7};
int arr7[][5] = {{1,2}, {3,4}, {5,6}};

2.二维数组的使用
1) 二维数组的下标
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 1 3,4,5,6,7};

#include <stdio.h>
int main()
{
    int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};//最右侧绿色的数字表示行号,第一行蓝色的            
                       //数字表示列号,都是从0开始的,比如,我们说:第2行,第4列,快速就能定位出7
    printf("%d\n", arr[2][4]);
    return 0;
}
2)二维数组的输入和输出
#include <stdio.h>
int main()
{
    int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
    int i = 0;//遍历行

    //输入
    for(i=0; i<3; i++) //产生行号
    {
        int j = 0;
        for(j=0; j<5; j++) //产生列号
        {
            scanf("%d", &arr[i][j]); //输入数据
        }
    }

    //输出
    for(i=0; i<3; i++) //产生行号
    {
        int j = 0;
        for(j=0; j<5; j++) //产生列号
        {
            printf("%d ", arr[i][j]); //输出数据
        }
        printf("\n");
    }
    return 0;
}

3. 二维数组在内存中的存储
#include <stdio.h>
int main()
{
    int arr[3][5] = { 0 };
    int i = 0;
    int j = 0;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 5; j++)
        {
            printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
        }
    }
    return 0;
}

每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以二维数组中的每个元素都是连续存放的

4. C99中的变长数组

变长数组的根本特征,就是数组长度只有运行时才能确定,所以变长数组不能初始化

在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量、常量表达式,或者如果我们初始化数据的话,可以省略数组大小(VS2022不支持)

int arr1[10];
int arr2[3+5];
int arr3[] = {1,2,3};

C99中给一个变长数组(variable-length array,简称 VLA)的新特性,允许我们可以使用变量指定
数组大小

int n = a+b;
int arr[n];

数组arr 就是变长数组,因为它的长度取决于变量n 的值,编译器没法事先确定,只有运行时才能知道n 是多少

程序可以在运行时为数组分配精确的长度

5. 数组练习
1)多个字符从两端移动,向中间汇聚
#include <stdio.h>
int main()
{
    char arr1[] = "welcome to bit...";
    char arr2[] = "#################";
    int left = 0;
    int right = strlen(arr1)-1;
    printf("%s\n", arr2);
    while(left<=right)
    {
        Sleep(1000);
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        left++;
        right--;
        printf("%s\n", arr2);
    }
    retutn 0;
}
2)二分查找
#include <stdio.h>    //比特
int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int left = 0;
    int right = sizeof(arr)/sizeof(arr[0])-1;
    int key = 7;//要找的数字
    int mid = 0;//记录中间元素的下标
    int find = 0;
    while(left<=right)
    {
        mid = (left+right)/2;
        if(arr[mid]>key)
        {
            right = mid-1;
        }
        else if(arr[mid] < key)
        {
            left = mid+1;
        }
        else
        {
            find = 1;
            break;
        }
    }
    if(1 == find )
        printf("找到了,下标是%d\n", mid);
    else
        printf("找不到\n");
}

求中间元素的下标,使用 mid = (left+right)/2 ,如果 lef t和 righ t比较大的时候可能存在问题,可以使用下面的方式:

mid = left+(1 right-left)/2;

谢谢观看

;