C语言学习-数组

  C语言支持一维数组和多维数组,如果一个数组的所有元素都不是数组,那么该数组被称为一维数组。

一维数组

一维数组的定义方式

在C语言中使用数组必须先进行定义。一维数组的定义方式为:

数据类型 数组名 [数组长度] = {元素,元素,…}

其中,数组长度指的是数组内元素的个数。例如:

int i[5] = {1,2,3,4,5};    //最常用的写法

也可以这样定义:

int i[5] = {1,2}; //第3、第4、第5个元素自动赋值为0
int i[5] = {0};    //所有元素都赋值为0

还有一种写法:

int i[5]; //不可直接使用,需给元素赋值
i[0] = 1; 
i[1] = 2;
i[2] = 3;   //赋值
i[3] = 4;
i[4] = 5; 

这里要注意,数组的下标是从0开始的,如a[0]表示数组a内的第一个元素。

下列定义方式是错误的:

int a = 5;
int i[a];

但是可以这样写:

# define a 5
int i[a];

一维数组的遍历

如果想要遍历一个一维数组,可以使用for循环:

int a[5] = {1,2,3};
for(i=0; i<5; i++)
{
    printf("%d ", a[i]); //输出结果为:1 2 3 0 0
}

一维数组的比较

如果想要比较两个一维数组中的元素,以下方式是错误的:

int a[5] = {1,2,3};
int b[5] = {1,2,3};
a == b;

原因:a指的是数组a内的第一个元素的内存地址,所以结果肯定为false。

正确的写法为:

int a[5] = {1,2,3};
int b[5] = {1,2,3};
for(i=0; i<5; i++)
{
    a[i] == b[i]; //结果为true
}

选择排序

选择排序原理:

第一个元素和其他元素一一比较,如果其他元素的值比较小,则对换两个元素的值,以此获得最小的值,放在数组的第一位。然后第二个元素和第二个元素以后的其他元素进行比较,如果其他元素的值比较小,则对换两个元素的值,以此获得第二小的值,放在数组的第二位,以此类推。

选择排序的实现:

# include <stdio.h>

int main(void)
{
    int a[10] = {1,8,9,5,2,3,45,12,15,30};
    int i;
    int j;
    int c; //容器
    for(i=0;i<=9;i++)
    {
        for(j=i;j<=9;j++)
        {
            if(a[i] > a[j+1])
            {
                c = a[i];
                a[i] = a[j+1];
                a[j+1] = c;
            }
        }
    }
    printf("排序后的值为:");
    for(i=0;i<=9;i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");

    return 0;
}

二维数组

二维数组的定义

二维数组的定义方式为:

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

其中2和3代表2行3列。

也可以这样定义:

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

不过这种定义方式不推荐,因为不够直观。

二维数组的实例

# include <stdio.h>
# define row 4 //行
# define col 3 //列

int main(void)
{
    //定义二维数组
    int a[row][col] = {
        {1,3,2},
        {5,6,4},
        {8,7,9},
        {12,11,10}
    };

    //输出排序前的二维数组
    int i, j, b, c, t;
    printf("排序前:\n");
    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            printf("%-3d", a[i][j]);
        }
        printf("\n");
    }
    printf("\n");

    //输出每行最大值
    int max;
    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            if(max < a[i][j])
            {
                max = a[i][j];
            }
        }
        printf("第%d行最大值为:%d\n", i+1, max);
    }
    printf("\n");

    //选择排序
    for(i=0;i<=<row*col-1;i++)
    {
        for(j=i;j<=row*col;j++)
        {
            b = i%row;
            c = j%col;
            if(a[b][c] > a[b][c+1])
            {
                t = a[b][c];
                a[b][c] = a[b][c+1];
                a[b][c+1] = t;
            }
        }
    }

    //输出排序后的二维数组
    printf("排序后:\n");
    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            printf("%-3d", a[i][j]);
        }
        printf("\n");
    }

    return 0;
}

多维数组

内存中是否存在多维数组?

不存在,因为内存是线性一维的。

n维数组可以当做每个元素是n-1维数组的一维数组。

比如:

int i[2][3];

该数组是含有2个元素的一维数组,只不过每个元素都可以再分成3个小元素

int i[2][3][4];

该数组是含有2个元素的一维数组,只不过每个元素都是3行4列的二维数组

坚持原创技术分享,您的支持将鼓励我继续创作!