一维数组
1.1、一维数组的定义

如果一个数组的元素不是数组,那么该数组称为一维数组

1.2、一维数组的存储

一维数组内存中存储在一段连续的空间中。

1.3、一维数组的声明
元素的类型 数组名[元素的个数];

示例:

#define NUM = 10

char  str[NUM];
short a[NUM];
int   b[NUM];
long  c[20];
float d[5 * 2];

注意:

C89C90中,元素的个数在编译的时候必须是确定的,也就是说,元素的个数必须是常量或者常量表达式

C99中,元素的个数可以在运行时确定,也就是说,元素的个数也可以是变量或者变量表达式

int main(int argc, char** argv) {
    double d[argc];
}

说明:上面这个数组声明在C99中是正确的,而在C89C90中 中是错误的。

在运行时确定大小并不意味着元素的个数可以变化,因为数组的大小一旦确定了,就不能改变大小了。

1.4、一维数组的初始化

初始化就是首次赋值。

一维数组初始化有很多种方式。

1.4.1、先声明,再赋值
方式一:逐个元素赋值

示例:

int main() {
    char str[5];
    str[0] = 'a';
    str[1] = 'b';
    str[2] = 'c';
    str[3] = 'd';
    str[4] = '\0';

    return 0;
}
方式二:通过memset函数赋值

示例:

#include<string.h>

int main() {
    char str[10];
    memset(str, 0, 10);

    return 0;
}
方式三:通过for循环遍历赋值

示例:

int main() {
    char str[10];
    for (int i = 0; i < 10; i++) {
        str[i] = '\0';
    }

    return 0;
}

注意:这种方式的效率很差,不建议使用。

1.4.2、声明的同时赋值

声明的同时赋值,这种赋值方式是在编译阶段进行的。这样将减少运行时间,提高效率。

声明的同时赋值的语法格式:

元素的类型 数组名[元素的个数] = {值1, 值2, ...值N};
方式一:给所有元素赋指定的初值

示例:

int a[5] = {1, 3, 5, 7, 9};

此时,声明的元素的个数可以省略,变成如下:

int a[] = {1, 3, 5, 7, 9};

这种缺少声明的元素的个数的情形,编译器根据后的大括号中的个数来确定。

方式二:给部分元素赋指定的初值

示例:

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

此时,其余的元素会根据数据类型赋予默认的初值。

上面的代码等同于如下的代码:

int a[] = {1, 3, 0, 0, 0};

根据这个特点,我们可以把所有元素都赋值为0

char str[10] = {0};

这里将所有的字符元素都初始化为ASCII码为0的字符,其实就是'\0', 它是字符串的结束符。

1.5、一维数组中元素的引用

数组元素是组成数组的基本单元。必须能够访问到每个数组元素,访问数组元素的格式:

数组名[下标]

下标的范围为[0 ~ 元素的个数-1],如int a[5]表示数组a5个元素。 这5个元素分别为a[0]a[1]a[2]a[3]a[4]

下标只能为整型常量或整型表达式。如果为浮点数,编译器将自动取整。

示例:

a[5]
a[i+j]
a[i++]
1.6、一维数组的指针

一维数组数组名就是该数组的指针,只是它是一个常量, 你不能直接对他进行++--等操作,只能将它赋给其他指针变量,对其他指针变量进行此等操作。

示例:

int a[] = {1, 3, 5, 7, 9};
int *p = a;
p++;
1.7、一维数组的使用示例

九九乘法表:

#include<stdio.h>

#define MAX 10

int main() {
    int i, j;
    for(i = 1; i < MAX; i++) {
        for(j = 1; j <= i; j++) {
            printf("%dx%d=%-2d ", i, j, i * j);
        }
        printf("\n");
    }
    return 0;
}

使用cc命令编译:

cc -o test test.c

运行效果如下: