关闭

C/C++进阶[5]

标签: 编译器struct
520人阅读 评论(0) 收藏 举报

一个很有趣的应用

关键字:迭代问题、一维数组范围

比如有一个结构,它是这样定义的:

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范围的改变需要外界的干预该迭代范围。该方式的好处是:可以灵活指定迭代的范围,可以是整个对象也可能是一部分。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16622次
    • 积分:272
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:0篇
    • 译文:1篇
    • 评论:1条
    最新评论