Идея «копирования указателя», если понимать ее буквально, является не чем иным, как простым присвоением.
int x = 5;
int* p1 = &x;
int* p2 = p1; // there, we copied the pointer.
В этом случае и p1
, и p2
указывают на одни и те же данные- переменная int
x
.Однако, поскольку это так тривиально, я склонен думать, что вы действительно * спрашиваете о том, как скопировать данные , на которые указывает указатель.
В этом случае это зависит от типа данных.Если указатель указывает на простой буфер из POD , это включает выделение отдельного буфера, а затем использование чего-то вроде memcpy
(или предпочтительно std::copy
) для копирования данных.Например:
int* p1 = new int[100];
// ... fill p1 with values
int* p2 = new int[100]; // create a new buffer
std::copy(p1, p1 + 100, p2); // copy the data into p2
Или, вы можете использовать memcpy
для копирования побайтного буфера, так как буфер содержит POD .
memcpy(p2, p1, 100 * sizeof(int));
Однако, если указанные данные не простой буфер, а скорее объект C ++, вы не можете использовать memcpy
.Вам нужно выполнить глубокую копию объекта (обычно используя конструктор копирования объекта), чтобы получить клон объекта.Как это сделать или возможно ли это, зависит от объекта.(Некоторые объекты не могут быть скопированы.)
Я понятия не имею, что такое jfloat
, но если объект, например, std::string
, вы бы просто сделали что-то вроде:
std::string* s1; // assume this points to a valid string
std::string* s2 = new std::string();
*s2 = *s1; // copies s1 using s2's assignment operator
В этом надуманном примере было бы предпочтительнее вообще избежать выделения кучи и просто использовать переменные стека.Но это демонстрирует идею копирования выделенного кучи объекта.