Создание собственного массива в C ++ с использованием указателей - PullRequest
0 голосов
/ 10 марта 2020

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

Поскольку концептуально я считаю, что массив - это просто указатель на его базовый элемент, и его приращение увеличивается на 1 будет указывать на следующий последующий элемент.

Я написал этот код в качестве основы для моего простого массива:

int x = 2;
int *ptr = &x;

int y = 3;
&y = ptr + 1;

Здесь мы создаем переменную x и используем ptr, чтобы указать на нее. Затем мы создаем переменную y и пытаемся изменить ее адрес памяти на следующий блок памяти после ptr (ptr + 1). Это должно создать симуляцию массива.

Теперь это не сработало, так как я позже узнал, что после создания переменной ее память фиксируется независимо от того, что и нет способа ее изменить. Итак, какие еще способы я могу использовать для создания собственного массива?

1 Ответ

0 голосов
/ 10 марта 2020

Надеюсь, это поможет:

int x = 2;
int *ptr = &x;     //ptr points to address of x. yes correct.

int y = 3;         
&y = ptr + 1;      //the address of next integer after x(internally, 
                   //   which is ptr) will be set to address of y(this 
                   //   won't work.)

в последней строке, если ваше намерение сделать так, чтобы y стал внутренним хранилищем рядом с x, этого не произойдет, потому что int y это объявление о том, что y будет владельцем данных и не будет перемещать свой адрес. его адрес фиксирован навсегда.

кроме того, это внутренняя память, основанная на вашем коде.

[ 1 byte ]    //4 bytes for integer x
[ 1 byte ]
[ 1 byte ]
[ 1 byte ]
[ 1 byte ]    //4 bytes for address holder ptr (in 32bit system)
[ 1 byte ]
[ 1 byte ]
[ 1 byte ]
[ 1 byte ]    //4 bytes for integer y
[ 1 byte ]
[ 1 byte ]
[ 1 byte ]

вы можете изменить y через x, обрабатывая его как массив .

(&x)[2] = 100;   //setting 100 to y indirectly.

примечание: это может не работать на разных компиляторах из-за внутренней оптимизации, поэтому это опасный тип кода, если вы используете его в реальных проектах. но вы можете на 100% использовать его для развлечения и исследования. один способ любить программирование больше.

другой безумный пример.

(&x)[1] = 0x123498;   //setting any address value to ptr.
(&x)[1] = &y;         //setting address of y to ptr.

к вашему первоначальному вопросу (надеюсь, я его понимаю)

Итак, каковы какие еще способы я могу использовать, чтобы иметь возможность создавать свой собственный массив?

, чтобы «создать» свой собственный массив, или, скажем, динамически создавать во время выполнения, вы должны сначала выделить последовательность байтов, которая будет соответствовать массиву нужного вам размера. а затем получить доступ к элементам или любым видам манипуляций с помощью указателя или ссылки.

//---allocate using malloc and free.
int *pIntBuffer = (int*)malloc( 500 * sizeof(int));  //request chunk of memory.
pIntBuffer[10] = 123;  //use the array any way you want.

free(pIntBuffer);      //be sure to destroy your requested chunk of memory if you don't need it anymore.

//---allocate using new/delete.
int *pAnotherBuff = new int[1000];
pAnotherBuff[900] = *pIntBuffer[10];

delete [] pAnotherBuff;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...