《C语言教程》09章 数组


一、数组的定义和赋值

C语言教程中,数组是重点、难点,许多人其实是一知半解,小雅建议还未上路的人,认真阅读本章内容。下面先举例再说明。

#include <stdio.h>

int main(void)
{
    int  i;
    int  iArr[7];
    char cArr[] = {'Q','U','A','N','X','U','E'};

    //给iArr数组赋值
    for (i=0; i<7; i++) {
        iArr[i] = (i + 1) * (i + 1);
    }

    //输出iArr的内容
    for (i=0; i<7; i++) printf("  %2d", iArr[i]);
    printf("\n");

    //输出cArr的内容
    for (i=0; i<7; i++) printf("  %2c", cArr[i]);
    printf("\n");

    //输出超出数组范围内容。该行运行时会出错。
    printf("iArr[7]=[%d]    cArr[7]=[%c]\n", iArr[7]);

    return 0;
}
  1. 数组名也是一变量名,定义时须指定类型和长度。
  2. 长度可以方括号中直接指定,也可以通过赋值来间接指定。
  3. 数组可以在定义时直接赋值,也可以定义时不赋值,之后再赋值。
  4. 当使用超出范围的值时,编译不出错,但运行会出错。(上例运行时出错后,选“忽略”后得到的结果)
二、数组的地址

弄清数组地址对使用数组有很大好处,另外,有的函数的参数是指针(如scanf函数),如果要用数组的某一元素作参数,就必须知道其地址。


#include <stdio.h>

int main(void)
{

    int  i;
    int  iArr[7];
    char cArr[] = {'Q','U','A','N','X','U','E'};

    //输出iArr数组和cArr数组的地址
    printf("iArr=%p, cArr=%p\n\n", iArr, cArr);

    //输出iArr[i]数组和cArr[i]数组的地址
    for (i=0; i<7; i++) {
        printf("iArr[%d]=%p, cArr[%d]=%p\n", i, &iArr[i], i, &cArr[i]);
    }

    return 0;
}
  1. 数组iArr是int类型,所以它的地址是按4字节递增。
  2. 数组cArr是char类型,所以它的地址是按1字节递增。
  3. 数组元素的地址是通过数组元素前面加“&”来取得。(如:&iArr[3])
  4. 数组名单独使用时,代表该数组的首地址。(iArr等同于&iArr[0])(注意:以后使用指针会经常用到这一点)
三、元素个数与赋值个数不一致时

当一个数组定义的长度大于赋值的长度时,超出的部分被放弃;当数组定义的长度小于赋值的长度时,不足的部分被自动填上'\0',对于数值类型的变量,实际上就是赋值为0,对于字符类型实际上就是赋值为NULL。


#include <stdio.h>

int main(void)
{
    int i;
    int  iNum[4] = {100, 150};  //后两个被填上0
    char str1[10] = {'q', 'u', 'a', 'n', 'x', 'u', 'e'};
    char str2[6] = "quanxue";

    for (i=0; i<4; i++) {
        printf("%5d", iNum[i]);
    }
    printf("\n%s\n", str1);     //7,8,9三个元素被填上NULL,所以可以用字符串输出
    for (i=0; i<10; i++) {      //故意循环到10, 看看后面是否为“quanxue”
        printf("%c", str2[i]);  //因为'e'和NULL被弃掉,所以不能用字符串输出
    }
    printf("\n");


    return 0;
}

四、二维数组
#include <stdio.h>

int main(void)
{
    int  i, j, k=0;
    int  iArr[4][5];

    //输出iArr[i,j]数组的地址
    for (i=0; i<4; i++) {
        for (j=0; j<5; j++) {
            iArr[i][j] = k++;
            printf("iArr[%d,%d]=%2d  &iArr[%d,%d]=%p\n", 
                i, j, iArr[i][j], i, j, &iArr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

从地址和内容可以看出,二维数组是一维数组的扩充,地址的排列也是顺序下去的。使用时注意2个下标,不要弄错就可以了。