C语言之多维数组

一、多位数组

有时,数组的维数并不止一维,例如一个记录消费中心在第一季度里各个月的收入数据就可以用二维数组来表示。定义二维数组的方法是在一维数组定义的后面再加上一个用方括号括起来的维数说明。例如:

float array[3][8];

实际上,这个数组可以看成3个连续的一维数组,每个一维数组具有8个元素。该数组在内存中的存储格式为最左边的维数相同的元素连续存储,也即按行存储的。首先存储第一行8个元素,其次是第二行,最后是第三行。

main()
{
    int array[3][3]={1,2,3,4,5,6,7,8,9};
    int i,j;
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++) printf("%3d");
        printf("\n");
    }
}

它的输出结果为:

1 2 3
4 5 6
7 8 9

可以看出,二维数组元素是按行存储的。
我们也可以对数组进行赋值,而不是初始化。

main()
{
    int array[3][3];
    int i,j;
    for(j=0;j<3;j++)
    for(i=0;i<3;i++) scanf("%d",&array[i][j]);
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++) printf("%3d");
        printf("\n");
    }
}

当输入1 2 3 4 5 6 7 8 9<回车>
输出为:

1 4 7
2 5 8
3 6 9

数组可以是二维、三维甚至是更高维数的,虽然C语言对维数的处理没有上限,但是处理高维数组是很头疼的事。一般尽量避免处理四维和四维以上的数组。下面看一个三维数组的例子:

main()
{ 
    int array[2][3][4];
    int i,j,k;
    for(i=0;i<2;i++)
    for(j=0;j<3;j++)
    for(k=0;k<4;k++) array[i][j][k]=i*12+j*4+k;
}

这个三维数组可以看成2个二维数组,每个二维数组又可以看成3个一维数组。可以在头脑里想象成两个平行平面,每个平面内有3*4个点。所以共有24个元素

二、字符串数组

上面讲的都是存放数值的,有一类数组,用来处理字符串的,我们叫字符串数组。其实字符串数组也是二维数组,只是它的特殊性,才单独拿出来说的。

main()
{
    char s[10][10];
    int i;
    for(i=0;i<10;i++) scanf("%s",s[i]);
}

先看它的输入特性,前面在说输入语句的时候说过,遇到字符串输入,可以不加'&',现在只要记住这个特性就可以,以后说指针的时候再讲为什么。但是这儿为什么用s[i],可能很多人不太明白。我们定义的是二维数组,而输入的时候,却使用一维数组的形式。这是因为字符串在内存里地址可以用它的名字表示,就好象这种形式:

main()
{
    char s[10];
    scanf("%s",s);
}

定义的是一维数组,输入语句用变量形式表示一样。通过前面的'%s'形式可以看出,s[i]是一个数组,所以s就是二维数组了。
这里要注意一点,scanf()函数在输入字符串时候不能支持空格,看下面的例子:

main()
{
    char s[3][10];
    int i;
    for(i=0;i<10;i++)
    scanf("%s",s[i]);
    for(i=0;i<3;i++)
    printf("%s",s[i]);
}

我们输入:

1111
2222 3333
4444

我们是想把1111赋值给s[0],2222 3333赋值给s[1],4444赋值给s[2]。可实际上编译器是这样做的,把1111赋值给s[0],把2222赋值给[1],把3333赋值给s[2]。

实际输出:1111
2222
3333

在输入字符串的时候,如果使用scanf(),就把空格当作下一个输入了。那么我们怎么解决这个问题呢?毕竟很多情况下,一行字符串肯定有空格出现的。我们使用新的函数gets()。这个函数是专门接受字符串输入的,它跳过了空格的影响。把上面的输入语言修改为gets(s[i])即可。
我们定义了char s3,超过10个字符肯定不行,如果少于10个字符,电脑怎么处理呢?电脑是在每个字符串的后面自动补上'',作为字符串的结束标志。
我们经常在填写一些可选择的内容时经常发现,待选的字符串都是按字母排列好的,我们怎么用C语言实现这个功能?在C语言里,字符串的排序是按照字符的ASCII码来的,如果第一个字符一样,则比较第二个,依次类推。

main()
{
    char s1[6]=addfgh,s2[5]=asdlg;
    int i;
    for(i=0;s1[i]!='\0'&&s2[i]!='\0';i++)
    {
        if(s1[i]<s2[i])
        {
            printf("s1<s2\n");
            exit(1);
        }
        else if(s1[i]>s2[i])
        {
            printf("s1>s2\n");
            exit(1);
        }
        else ;
    }
    if(s1[i]=='\0' && s2[i]!='\0') printf("s1<s2\n");
        else if(s2[i]=='\0' && s1[i]!='\0') printf("s1>s2\n");
            else printf("s1==s2\n");
}

上面的例子就是比较两个字符串大小的,先比较第一个,如果相同,接着比较第二个,如果不相同,则分出大小。一直往后比较,直到其中某一个到'',你也可以先用strlen()函数找出最小的长度。
exit()函数的作用是退出程序,具体它的用法可以看看相关资料。
其实C语言把我们经常需要的字符串处理函数都做好了,我们只需要调用它即可。如strcmp()用来比较、strcpy()用来拷贝等等。看看它们的用法

#include "string.h"
main()
{
    char s1[10],s2[10],s2[10];
    int k;
    gets(s1);
    gets(s2);
    k=strcmp(s1,s2); /*比较s1和s2大小*/
    if(k==0) printf("s1==s2\n");
        else if(k>0) printf("s1>s2\n");
            else printf("s1<s2\n");
    strcpy(s3,s1); /*把s1拷贝到s3*/
    printf("%s\n",s3); 
}

可以看出,比较大小时,如果k<0,则s10,则s1>s2;如果k=0,则s1=s2。实际上这是一个函数,具体什么是函数,以及为什么写成那种形式,我们下节再说。这些函数都包含在string.h头文件中,所以在程序的开头,都要写上#include string.h。

字符串处理有很多函数,你们可以看看相关的书,也可以看看Turbo C的帮助。
添加新评论