C/C++ : 为什么不能在循环初始化中声明指针
C/C++ : Why is it impossible to declare a pointer in loop initialization
打印数组时,初始化一个整数有效。
int a[MAX_SIZE] = {1,2,3,4,5,6,7,8,9,10};
for (int i = 0; i <= (MAX_SIZE - 1); i++)
{
printf("%3d",a[i]);
}
但是,我想知道为什么初始化一个指向整数 ("walker") 的指针不起作用:
int a[MAX_SIZE] = {1,2,3,4,5,6,7,8,9,10};
for (int *aWalk = a, int *aEnd = a + MAX_SIZE - 1; aWalk <= aEnd; aWalk++)
{
printf("%3d", *aWalk);
}
你在第二个代码中多了一个int
。你的逗号位置也是错误的。还删除了不必要的 aEnd
变量。
int a[MAX_SIZE] = {1,2,3,4,5,6,7,8,9,10};
for (int *aWalk = a; *aWalk < (a + MAX_SIZE - 1); aWalk++)
{
printf("%3d", *aWalk);
}
语句 int *aWalk = a, int *aEnd = a + MAX_SIZE - 1;
甚至不能单独工作,所以它也不能在循环头中工作。您正在寻找的语法是这样的:
int *ptr1 = some_address, *ptr2 = some_other_address;
这适用于循环内外。另外,请注意您的问题不是声明一个指针而是两个。这也是为什么你应该首先提取一个最小的例子。
你可以只使用指针算法来做到这一点。这是有效的,因为您正在声明一个数据数组,并且该数据连续存储在内存中。
int a[] = {1,2,3,4,5,6,7,8,9,10};
for (int *aWalk = a; aWalk < (a + sizeof(a) / sizeof(int)); aWalk++)
{
printf("%3d", *aWalk);
}
也可以在这里尝试 IDE One[^]。
编辑:
由于评论,我使用结束指针更改了代码。 code[^].
for (int *aWalk = a, *aEnd = (a + sizeof(a) / sizeof(int)); aWalk < aEnd; aWalk++)
{/*...*/}
for
初始表达式可以是多个变量的定义,只要组合成一个定义即可:
int a[MAX_SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (int *aWalk = a, *aEnd = a + MAX_SIZE; aWalk < aEnd; aWalk++) {
printf("%3d ", *aWalk);
}
请注意,将结束指针定义为指向数组末尾更通用,因为这种形式可以处理宽度为 0
的切片。
打印数组时,初始化一个整数有效。
int a[MAX_SIZE] = {1,2,3,4,5,6,7,8,9,10};
for (int i = 0; i <= (MAX_SIZE - 1); i++)
{
printf("%3d",a[i]);
}
但是,我想知道为什么初始化一个指向整数 ("walker") 的指针不起作用:
int a[MAX_SIZE] = {1,2,3,4,5,6,7,8,9,10};
for (int *aWalk = a, int *aEnd = a + MAX_SIZE - 1; aWalk <= aEnd; aWalk++)
{
printf("%3d", *aWalk);
}
你在第二个代码中多了一个int
。你的逗号位置也是错误的。还删除了不必要的 aEnd
变量。
int a[MAX_SIZE] = {1,2,3,4,5,6,7,8,9,10};
for (int *aWalk = a; *aWalk < (a + MAX_SIZE - 1); aWalk++)
{
printf("%3d", *aWalk);
}
语句 int *aWalk = a, int *aEnd = a + MAX_SIZE - 1;
甚至不能单独工作,所以它也不能在循环头中工作。您正在寻找的语法是这样的:
int *ptr1 = some_address, *ptr2 = some_other_address;
这适用于循环内外。另外,请注意您的问题不是声明一个指针而是两个。这也是为什么你应该首先提取一个最小的例子。
你可以只使用指针算法来做到这一点。这是有效的,因为您正在声明一个数据数组,并且该数据连续存储在内存中。
int a[] = {1,2,3,4,5,6,7,8,9,10};
for (int *aWalk = a; aWalk < (a + sizeof(a) / sizeof(int)); aWalk++)
{
printf("%3d", *aWalk);
}
也可以在这里尝试 IDE One[^]。
编辑:
由于评论,我使用结束指针更改了代码。 code[^].
for (int *aWalk = a, *aEnd = (a + sizeof(a) / sizeof(int)); aWalk < aEnd; aWalk++)
{/*...*/}
for
初始表达式可以是多个变量的定义,只要组合成一个定义即可:
int a[MAX_SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (int *aWalk = a, *aEnd = a + MAX_SIZE; aWalk < aEnd; aWalk++) {
printf("%3d ", *aWalk);
}
请注意,将结束指针定义为指向数组末尾更通用,因为这种形式可以处理宽度为 0
的切片。