Указатели и массивы без использования индекса - PullRequest
0 голосов
/ 01 января 2019

Меня попросили суммировать массив int и вернуть сумму, не используя индекс.(функция должна получить массив и размер)

Я знаю, что должен был установить указатель на массив и сравнить указатель с адресом массива и использовать указатель ++ для запуска над массивом.

То есть, я записал следующий код:

int sumArray(int nNumArray[], int nSize)
{
    int nSum = 0;

    while(*nNumArray <= &nNumArray[nSize-1])
    {
        nSum += *nNumArray;
        nNumArray++;
    }
    return nSum;
}

, который отлично работает,

вещь * nNumArray ссылается на значения, а & nNumArray [nSize-1] ссылается на адрес.

Я пытаюсь понять, как это работает.

Буду признателен за некоторые идеи.Спасибо.

Ответы [ 3 ]

0 голосов
/ 01 января 2019

Неверное условие цикла while:

while(*nNumArray <= &nNumArray[nSize-1])

, поскольку вы сравниваете целое число (*nNumArray) с указателем (&nNumArray[nSize-1]).Компилятор должен выдавать предупреждающее сообщение на это утверждение.

Вместо этого вы можете сделать:

int sumArray(int nNumArray[], int nSize)
{
    int nSum = 0;

    while(nSize--)
    {
        nSum += *nNumArray;
        nNumArray++;
    }
    return nSum;
}
0 голосов
/ 01 января 2019

Первая ошибка здесь:

(*nNumArray <= &nNumArray[nSize-1])

Имя самой переменной массива считается указателем в C, поэтому *nNumArray представляет ссылкууказателя.

Это должно быть nNumArray, чтобы он сравнивал адрес.

Вторая ошибка :

Он не будет работать идеальноесли только первая ошибка исправлена.

Операция индекса работает следующим образом:

&nNumArray[nSize-1] работает так же, как nNumArray + nSize - 1

Таким образом, цикл while может выглядеть следующим образом:

while(nNumArray <= nNumArray + nSize - 1){
    nSum += *nNumArray;
    nNumArray++;
}

(Это может упростить поиск неправильной информации)

Цикл while будет работать вечно, пока *nNumArray не получит доступ к int , который находится вне массива, который вызываетошибка сегментации.

Возможно, вы захотите сделать это, используя другой указатель для сравнения с nNumArray + nSize - 1, и вся функция sumArray должна выглядеть так:

int sumArray(int nNumArray[], int nSize)
{
    int nSum = 0;
    int *ptr = nNumArray;
    while(ptr <= nNumArray + nSize - 1)
    {
        nSum += *ptr;
        ptr++;
    }
    return nSum;
}

А теперь этодолжно отлично работать:)

0 голосов
/ 01 января 2019

"который работает идеально": это невозможно

(*nNumArray <= &nNumArray[nSize-1]): вы сравниваете int с вектором (и позже вне его) и адресом int в вектор (и фактически после его окончания).Априори ваш компилятор сообщает об ошибке

Кроме того &nNumArray[nSize-1] не будет концом вектора после первого цикла, потому что вы изменяете nNumArray

Если вы хотите использоватьуказатель, который вы можете использовать для хранения другой переменной, чтобы не изменять nNumArray , а также изменять тест как (ptr <= &nNumArray[nSize-1]):

#include <stdio.h>

int sumArray(int nNumArray[], int nSize)
{
    int nSum = 0;
    int * ptr = nNumArray;

    while(ptr <= &nNumArray[nSize-1])
    {
        nSum += *ptr++;
    }
    return nSum;
}

int main()
{
  int a[3] = {1,2,3};

  printf("%d\n", sumArray(a, 3));
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...