C / C ++:为什么在循环初始化中声明指针是不可能的

时间:2016-03-21 07:59:32

标签: c loops initializer-list initializing

打印数组时,初始化整数有效。

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);
}

4 个答案:

答案 0 :(得分:7)

语句int *aWalk = a, int *aEnd = a + MAX_SIZE - 1;甚至不能独立工作,因此它也无法在循环头中工作。您正在寻找的语法是:

int *ptr1 = some_address, *ptr2 = some_other_address;

这适用于循环内部和外部。另请注意,您的问题不是声明一个指针而是两个指针。这也是为什么你应该首先提取一个最小的例子。

答案 1 :(得分:1)

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的切片。

答案 2 :(得分:0)

只能使用指针算法这样做。这是有效的,因为您正在声明一个数据数组,并且这些数据会持续存储在内存中。

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++)
{/*...*/}

答案 3 :(得分:-1)

第二个代码中有一个额外的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);
}