#include <stdio.h>
int main() {
int a[] = { 5, 5, 8, 34, 12, 2 };
int *p;
int i = 0, c = 0;
int sum = 0;
for(p = &a[i]; i < sizeof(a) / sizeof(a[0]); i++) {
sum += *p;
}
printf("the sum is %d\n", sum);
}
Я пытался найти сумму элементов массива с помощью указателя, но результат неверен. Значение i
действительно увеличивается, но в выражении a[i]
этого не наблюдается. Я хочу знать, почему увеличение i
не влияет на индексацию массива a
.
я увеличиваю i и p=&a[i]; поэтому p должен указывать на следующий элемент!
C не Excel. p
не меняется при изменении &a[i]
, если только вы не укажете это явно.
хорошо, но почему?
Мое исправление состояло бы в том, чтобы попытаться изменить приращение на p=&a[++i]
, но я чувствую, что это не очень хороший подход.
@anas Вы инициализируете значение как адрес первого элемента, и увеличение переменной, которую вы использовали в этом расчете, не обновляет эту переменную. Это как сказать a = 3; b = 2*i; i++
, что не изменит b с 6 на 8.
Правильный способ написать это — избавиться от указателя p
в первую очередь и использовать вместо него a[i]
.
Если вы хотите использовать указатели, вам нужно избавиться от остатка вашего предыдущего кода, в котором использовался оператор индекса.
Здесь p
указывает на &a[0]
(только a
здесь превращается в int*
, поэтому нет необходимости выписывать &a[0]
), а end
указывает на один элемент после последнего элемента. Поэтому итерация должна остановиться, когда p == end
.
#include <stdio.h>
int main(void) {
int a[] = {5, 5, 8, 34, 12, 2};
int sum = 0;
for (int *p = a, *end = a + sizeof a / sizeof *a; p != end; ++p) {
sum += *p;
}
printf("the sum is %d\n", sum);
}
В этом цикле for
for(p=&a[i];i<sizeof(a)/sizeof(a[0]);i++){
sum+= *p;
}
указатель p
всегда указывает на первый элемент массива, потому что указатель инициализируется только один раз p=&a[i]
, когда i
равен 0
и не изменяется в цикле for.
Если вы хотите использовать указатель для доступа к элементам массива в цикле for, тогда переменная i
является избыточной. Вместо этого напишите
int a[] = { 5, 5, 8, 34, 12, 2 };
const size_t N = sizeof( a ) / sizeof( *a );
int sum = 0;
for ( const int *p = a; p != a + N; ++p ){
sum += *p;
}
printf( "the sum is %d\n",sum );
Обратите внимание на то, что в этом объявлении в операторе for
const int *p = a;
указатель массива a
неявно преобразуется в указатель на его первый элемент. Поэтому достаточно написать, как показано выше, вместо
const int *p = &a[0];
@anas Вовсе нет. Пожалуйста.:)
Вы никогда не увеличиваете
p
.