Эффективный способ копирования массива указателя на другой указатель

Как скопировать массив указателя на другой указатель.

Мой подход таким образом

int *ptr2[(i-1)*100];
int *ptr1;

ptr1=&ptr2[(i-1)*100];

Каков эффективный способ копирования, чтобы он занимал меньше цикла процессора.


c
person sam    schedule 04.08.2015    source источник
comment
Вы не копируете массив. Вы только назначаете адрес массива переменной-указателю. Это не требует процессорного времени (вряд ли). Пожалуйста, лучше объясните, что вы хотите сделать.   -  person Paul Ogilvie    schedule 04.08.2015
comment
Итак, у вас есть массив ptr2 размера (i - 1) * 100, а затем вы индексируете его с помощью (i - 1) * 100. Этот индекс слишком велик на 1.   -  person meaning-matters    schedule 04.08.2015
comment
memcpy () - лучший выбор, когда дело касается копирования массивов.   -  person Peter Miehle    schedule 04.08.2015
comment
Я не понимаю, почему за этот вопрос проголосовали против. Люди всегда борются с указателями, и мы здесь, чтобы помочь / объяснить.   -  person Pynchia    schedule 04.08.2015
comment
@Pynchia уже есть много ресурсов о том, какие указатели и массивы есть, а какие нет. Это тоже не такая уж сложная тема. Таким образом, люди устали от бессмысленных вопросов о массивах и указателях, которые не требуют никаких исследовательских усилий.   -  person Quentin    schedule 04.08.2015
comment
возможный дубликат более быстрой альтернативы memcpy?   -  person Evil Dog Pie    schedule 04.08.2015


Ответы (2)


Если вам нужно продублировать (скопировать) ptr2, вам нужно объявить ptr1 с правильным типом, выделить место для массива ptr1, затем скопировать содержимое ptr2 в ptr1

#include <malloc.h>
#include <string.h>

int *ptr2[(i-1)*100];
int **ptr1; // a pointer to a pointer to an int

ptr1 = malloc(sizeof(ptr2));
memcpy(ptr1, ptr2, sizeof(ptr2));

Примечание: это пример. Всегда проверяйте, чтобы malloc выделил блок памяти перед его использованием и освободите его, когда он больше не нужен (используйте free)

С другой стороны, если вы просто хотите создать псевдоним для ptr2

int *ptr2[(i-1)*100];
int **ptr1; // a pointer to a pointer to an int

ptr1 = ptr2;
person Pynchia    schedule 04.08.2015
comment
Как вы думаете, что sizeof(ptr2) вернется? - person qrdl; 04.08.2015
comment
Я понимаю вашу точку зрения. siezof (ptr2) возвращает всю занятость массива. (т.е. intsize * (i-1) * 100). Пожалуйста, не стесняйтесь описывать точные формулировки. Ответ отредактирован. Голосовать против обсуждения перед обсуждением невежливо. - person Pynchia; 04.08.2015
comment
@qrdl ptr2 - это массив, содержащий (i-1)*100 элементов типа int*, поэтому sizeof(ptr2) вернет количество байтов, занятых этим массивом, которое будет зависеть от архитектуры оборудования. Имя сбивает с толку, так как * помещается рядом с именем переменной, а не рядом с int. Более четкое заявление могло бы быть таким: int* arrayOfPointersToIntegers[(i-1)*100];. В целом код в ответе будет вести себя так, как задумано. - person Evil Dog Pie; 04.08.2015
comment
@Pynchia Этот ответ на самом деле не отвечает на вопрос об эффективности использования memcpy в отличие от какой-либо другой техники ручного прядения. Я подозреваю, что большинство реализаций memcpy (являющейся библиотечной функцией) предварительно оптимизированы для повышения производительности, хотя во встроенном ПО это не всегда верно для некоторых конкретных задач. - person Evil Dog Pie; 04.08.2015

Вы можете использовать memcpy для копирования значений -

int *ptr2[(i-1)*100];
int **ptr1;

prt1=malloc(sizeof(ptr2));     //also remember to free allocated memory.

memcpy(ptr1,ptr2,sizeof(ptr2));
person ameyCU    schedule 04.08.2015
comment
Зачем забрасываете результат sizeof? malloc и memcpy оба принимают size_t, который предоставляет sizeof. - person Quentin; 04.08.2015
comment
@Quentin Да, я вижу, что в этом гипсе нет необходимости. Спасибо !! - person ameyCU; 04.08.2015
comment
ты уверен насчет типа ptr1? - person Pynchia; 04.08.2015
comment
@Pynchia Эмм ... почти наверняка. Почему возникла проблема? - person ameyCU; 04.08.2015
comment
согласно вашему объявлению int *ptr1, ptr1 является указателем на целое число. Но ptr2 - это массив указателей (на целое число), а не массив целых чисел. - person Pynchia; 04.08.2015
comment
@Pynchia Да, я в курсе. Но мы копируем ценность, не так ли. Так что не думаю, что возникнет какая-то проблема. Пожалуйста, поправьте, если я ошибаюсь. - person ameyCU; 04.08.2015
comment
@Pynchia Ох, понял, что сделал. Глупо с моей стороны. Спасибо !! - person ameyCU; 04.08.2015