Сумма элементов массива с использованием указателя в C

#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.

Вы никогда не увеличиваете p.

Johnny Mopp 14.02.2023 22:53

я увеличиваю i и p=&a[i]; поэтому p должен указывать на следующий элемент!

anas 14.02.2023 22:54

C не Excel. p не меняется при изменении &a[i], если только вы не укажете это явно.

dbush 14.02.2023 22:54

хорошо, но почему?

anas 14.02.2023 22:56

Мое исправление состояло бы в том, чтобы попытаться изменить приращение на p=&a[++i], но я чувствую, что это не очень хороший подход.

B Remmelzwaal 14.02.2023 22:57

@anas Вы инициализируете значение как адрес первого элемента, и увеличение переменной, которую вы использовали в этом расчете, не обновляет эту переменную. Это как сказать a = 3; b = 2*i; i++, что не изменит b с 6 на 8.

B Remmelzwaal 14.02.2023 22:58

Правильный способ написать это — избавиться от указателя p в первую очередь и использовать вместо него a[i].

Lundin 15.02.2023 09:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы хотите использовать указатели, вам нужно избавиться от остатка вашего предыдущего кода, в котором использовался оператор индекса.

Здесь 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 Вовсе нет. Пожалуйста.:)

Vlad from Moscow 14.02.2023 23:26

Другие вопросы по теме