做了一些指针数学,并没有工作

时间:2014-08-22 19:18:30

标签: c pointers

我试图在c中学习指针,为此我重新设计了一个for循环,从最后开始并循环到开头。

int main(int argc, char* argv[]) {
    int ages[] = {23, 43, 12, 89, 2};
    char* names[] = {"Alan", "Frank", "Mary", "John", "Lisa"};

    // safely get the size of ages
    int count = sizeof(ages) / sizeof(int);
    int i = 0;

    int* cur_age = ages;
    char** cur_name = names;

    // This is the original for loop:
    for (cur_name = names, cur_age = ages; (cur_age - ages) < count;
         cur_name++, cur_age++) {
        printf("%s lived %d years so far.\n", *cur_name, *cur_age);
    }

    // This is my version:
    for (cur_name = names + (count - 1), cur_age = ages + (count - 1);
         cur_age == ages; cur_name--, cur_age--) {
        printf("%s lived %d years so far.\n", *cur_name, *cur_age);
    }

    // I added this line and observed that cur_name is always equal to names +
    // 32
    // for example names: 0x7fff55268250, cur_name: 0x7fff55268270
    printf(" names: %p, cur_name: %p\n", names, cur_name);
}

问题是我的for循环版本没有打印任何内容,尽管我已经观察到指针的初始化实际上正在改变它们的值。我已经检查了数学,但仍然无法弄清楚为什么这不起作用。任何启蒙都将受到高度赞赏。

2 个答案:

答案 0 :(得分:4)

您的循环条件错误,应该是cur_age >= ages,而不是cur_age == ages

编写它的方式,第一次迭代时循环条件为false,因此循环立即终止。

答案 1 :(得分:0)

循环的条件部分

for (cur_name = names + (count - 1), cur_age = ages + (count - 1);
     cur_age == ages; cur_name--, cur_age--) {
    printf("%s lived %d years so far.\n", *cur_name, *cur_age);
}

看起来像

cur_age == ages;

但最初cur_age设置为cur_age = ages + (count - 1) 因此,当count等于1时,循环永远或只有一次迭代。

通常这样的循环按以下方式编写

for (cur_name = names + count, cur_age = ages + count;
     cur_age != ages; ) {
    printf("%s lived %d years so far.\n", *--cur_name, *--cur_age);
}