我试图在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循环版本没有打印任何内容,尽管我已经观察到指针的初始化实际上正在改变它们的值。我已经检查了数学,但仍然无法弄清楚为什么这不起作用。任何启蒙都将受到高度赞赏。
答案 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);
}