从头学C(50)指针数组的初始化

0

第五章 指针与数组 >> 5.8 指针数组的初始化

之前通过排序的例子,我们学习了指针数组的使用,如何声明指针数组,如何将 lineptr[i]指向正确的字符串等等,但我们还并未看到指针数组应该如何初始化。

现在来看一个 month_name(n) 函数的例子,它返回一个指向第 n 个月名字的字符串的指针,如果 n 是个非法值,也需返回一个含有错误提示的字符串的指针。

#include <stdio.h>

/* month_name: return name of n-th month */
char *month_name(int n)
{
        static char *name[] = { 
                "Illegal month",
                "January",      "February",     "March",
                "April",        "May",          "June",
                "July",         "August",       "September",
                "October",      "November",     "December"
        };
        if(n < 0 || n > 12 )
                return name[0];
        else
                return name[n];
}

int main()
{
        int i;

        for(i = 0; i < 13; i++)
                printf("[%d]\t%s\n", i, month_name(i));
}

可以看到,指针数组的初始化语法和前面所讲的其他类型对象的初始化语法非常类似。 name 的声明和之前的 lineptr 的声明相同,是一个一维数组,且数组中每个元素都是一个字符指针。

指针数组 name 的初始化是通过一个字符串列表实现的,列表中的每个字符串赋值给数组相应位置的元素。第 i 个字符串的所有字符存储在存储器的某个位置,而 name[i]中存放的便是这个字符串第一个字符的地址。

声明中没有指明 name 的长度,因为编译器在进行编译的时候会对初值个数(也就是字符串列表中的字符串个数)进行统计,并将这个数字填入数组的长度。

Leave A Reply