C ++ Массивы указателей - PullRequest
2 голосов
/ 12 мая 2011

Код

#include "stdafx.h"
#include <iostream>

void someFunc(double* pDoubleArray, int length)
{
    double* pNewDoubleArray = new double[length];

    for(int i = 0; i < length; i++)
    {
        pNewDoubleArray[i] = i * 3 + 2;
    }

    pDoubleArray = pNewDoubleArray;
}
int main()
{
    double dbls[] = { 1, 2, 3, 4, 5 };

    int length = sizeof dbls / sizeof dbls[0];

    std::cout << "Before..." << std::endl;

    for(int i = 0; i < length; i++)
    {
        std::cout << dbls[i] << ", ";
    }

    std::cout << std::endl;

    someFunc(dbls, length);

    std::cout << "After..." << std::endl;

    for(int i = 0; i < length; i++)
    {
        std::cout << dbls[i] << ", ";
    }

    std::cout << std::endl;

    while(true){ }

    return 0;
}

выход

Before...
1, 2, 3, 4, 5,
After...
1, 2, 3, 4, 5,

Вот что я пытаюсь сделать: 1. Создайте массив и заполните его некоторыми значениями 2. Передайте этот массив в качестве указателя на функцию, которая создаст новый массив, и переназначьте тот, который был передан во вновь созданный массив. 3. Распечатайте изменения

Я не вижу каких-либо изменений, и я не знаю, почему.

Ответы [ 4 ]

1 голос
/ 12 мая 2011

Интерфейс вашей функции someFunc неправильный.Требуется ссылка на адрес указателя (или указатель на указатель), чтобы вы могли вернуть адрес вашего нового массива.В противном случае вы просто изменяете локальное значение.

void someFunc(double*& pDoubleArray, int length)
{
  double* pNewDoubleArray = new double[length];

  for(int i = 0; i < length; i++)
  {
    pNewDoubleArray[i] = i * 3 + 2;
  }

  pDoubleArray = pNewDoubleArray;
}

Ваша вызывающая основная функция должна затем передать значение, которое можно изменить:

int main()
{
  double dbls[] = { 1, 2, 3, 4, 5 };
  double* pArray = dbls;
  // ...

  someFunc(pArray, length);
  // ...

  for(int i = 0; i < length; i++)
  {
    std::cout << pArray[i] << ", ";
  }
  // ...
}
0 голосов
/ 12 мая 2011

Строка pDoubleArray = pNewDoubleArray; назначает локальную копию указателя

Либо передайте указатель по ссылке, либо передайте указатель на него, либо верните новое значение

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

0 голосов
/ 12 мая 2011

Непонятно, почему вы передаете старый массив функции, которая не использует его .

Если вы изменяете отдельные значения, то нет смысла создавать новый экземпляр массива. Если нет, то просто создайте новый массив и верните его.

Итак, либо измените исходный массив:

void someFunc(double* pDoubleArray, int length)
{
    for(int i = 0; i < length; i++)
    {
        pDoubleArray[i] = i * 3 + 2;
    }
}

Или вернуть новый массив из функции:

// this indicates that the returned value is
// actually a new instance
double* getNewArray(double* pDoubleArray, int length)
{
    double* pNewDoubleArray = new double[length];

    for(int i = 0; i < length; i++)
    {
        pNewDoubleArray[i] = i * 3 + 2;
    }

    return pNewDoubleArray;
}

Альтернативой является передача входного массива по ссылке, но это усложняет освобождение неиспользуемых экземпляров.

[Изменить]

Чтобы прояснить этот последний случай:

void someFunc(double** pDoubleArray, int length)
{
    double* pNewDoubleArray = new double[length];

    for(int i = 0; i < length; i++)
    {
        pNewDoubleArray[i] = i * 3 + 2;
    }

    *pDoubleArray = pNewDoubleArray;
}

void main()
{
    double dbls[] = { 1, 2, 3, 4, 5 };
    double* pArray = dbls;

    // this will change what pArray
    // points to
    someFunc(&pArray, 5);

    return 0;
}

Как я уже говорил, последний подход приведет к утечкам памяти, если pArray указывает на выделенный массив кучи до вызова someFunc.

0 голосов
/ 12 мая 2011

Игнорирование проблемы утечки памяти, которая приводит к:

void someFunc(double* & pDoubleArray, int length)
// pass by reference ^^^ the pointer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...