C/C++: почему невозможно объявить указатель при инициализации цикла
При печати массива инициализация целого числа работает.
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]);
}
Однако мне интересно, почему инициализация указателя на целое число ("ходок") не будет работать:
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 ответа
Заявление int *aWalk = a, int *aEnd = a + MAX_SIZE - 1;
даже не работал бы сам по себе, поэтому он не может работать и в заголовке цикла. Синтаксис, который вы ищете, это:
int *ptr1 = some_address, *ptr2 = some_other_address;
Это работает внутри и снаружи цикла. Также обратите внимание, что ваша проблема не в объявлении одного указателя, а в двух. Вот почему вы должны сначала извлечь минимальный пример.
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[] = {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 [^].
редактировать:
из-за комментариев я изменил код, используя указатель конца. код [^].
for (int *aWalk = a, *aEnd = (a + sizeof(a) / sizeof(int)); aWalk < aEnd; 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);
}