一个很有趣的应用
关键字:迭代问题、一维数组范围
比如有一个结构,它是这样定义的:
typedef struct MyStuc
{
int nID;
char *pszText;
} MyStuc;
那么MyStuc的一个实例可以是:
MyStuc mt[] = {
{0, "Text 1"},
{1, "Text 2"},
{2, "Text 3"}
};
这样的话我们很容易就能进行转化,并且能够保证结果是等效的:
MyStuc mt[3];
mt[0].nID = 0;
mt[0].pszText = "Text 1";
...
mt[2].pszText = "Text 2";
前一个mt定义的同时进行初始化,由编译器决定维数大小;而后一个则先定义后初始化,并且指定了维数大小。显然,它们的空间大小一样。但在迭代中,怎么应用呢?看下面的例子:
int nMax = sizeof(mt) / sizeof(mt[0]);
for (int i = 0; i < nMax ; ++i)
{
//do something
mt[i] ....
}
它的优点在于自动限制mt的下标范围。下标在int nMax = sizeof(mt) / sizeof(mt[0]);求出。这样做的好处是:无需干预整个数组的迭代,界限由程序算出。
而第二个例子:
int nMax = 3;
for (int i = 0; i < nMax; ++i)
{
//do something
mt[i]....
}
下标是一个常量,这是要程序员指定的,对于mt范围的改变需要外界的干预该迭代范围。该方式的好处是:可以灵活指定迭代的范围,可以是整个对象也可能是一部分。