Теперь вам придется много практиковаться, чтобы закрепить знания и до конца разобраться. Решим несколько задач для начала.
1. The task of the elementary, but it requires a good understanding of what pointers. Dan pointer: double**p=0; Perform the following tasks (solutions can execute within the function main): * create a design, shown in Figure; * print number, specified in the box, the screen; * then delete all dynamic objects.
Yet again – We are looking for the shortest solution. Author: Olej
View code
Задача 1: Указатели в С++
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
usingnamespacestd;
intmain(void){
double**p=0;
*(*(p=newdouble*)=newdouble)=2;
cout<<**p<<endl;
delete*p;
deletep;
}
2. Объявите указатель на массив типа double и предложите пользователю выбрать его размер. Далее напишите четыре functions: первая должна выделить память для массива, second– заполнить ячейки данными, третья – показать данные на экран, четвертая – освободить занимаемую память. The program should prompt the user to continue working (создавать новые динамические массивы ) or withdraw from the program.
Остановимся на функции, которая выделяет память под массив, размер которого задает пользователь. This functiongiveMemoryToArr(). Определение находится в строках 34 – 38. As seen – as a result, it returns a pointer double. Look – if the function has typevoid, как бы она работала? В нее передался бы указатель и заданный размер. Далее для этого указателя выделяется участок памяти – string 36. And all– при выходе их функции копия указателя уничтожается и адрес этого участка памяти нигде не сохранен. Поэтому функция должна вернуть адрес (pointer) as a result of. That is the memory address of the selected area we will have to be written in the pointer, который объявлен в main() in string 13.
Result:
3. Объявите указатель на массив типа int и выделите память память для 12-ти элементов. It is necessary to write a function, которая поменяет значения четных и нечетных ячеек массива. Например есть массив из 4-х элементов:
Определение функции, которая меняет данные местами, находится в строках 40 – 52. It declared a temporary variablebufferVar. Она будет выполнять роль буфера для значений, которые необходимо будет записать в другую ячейку. Loop for will go through all the cells of the array. If the index– even number(если остаток от деления на 2 is 0), then write down the value of this cell to a variablebufferVar. В саму четную ячейку записывается значение следующей (нечетной): ptrArr[i]=ptrArr[i+1]; And then we have to copy the value of the oddbufferVar: ptrArr[i+1]=bufferVar; Then the cycle and block if перейдут к проверке следующей ячейки.
Результат работы:
4. Declare and populate a two-dimensional array of dynamic random numbers from 10 to 50. Показать его на экран. Для заполнения и показа на экран написать отдельные функции. (подсказка: функции должны принимать три параметра – указатель на динамический массив, количество строк, количество столбцов). The number of rows and columns the user selects.
View code
Задача 4: Указатели в С++, Двумерный динамический массив
Первое на что надо обратить внимание – это объявление динамического двумерного массива, allocating memory for it and its liberation. When we looked at the topic Двумерные массивы в С мы затрагивали тот вопрос, что двумерный массив – is an array of arrays. Например если объявлен двумерный массив int ArrForChange[3][3], it means that it contains three arrays of three elements each. Объявляется двумерный динамический массив с применением операции ** (двойная звездочка). Это указатель на указатель. Он содержит в себе адрес массива указателей, каждый элемент которого хранит адрес какой-то строки двумерного массива. Визуально это можно показать так:
Сначала надо выделить память под массив, который будет содержать адреса строк двумерного массива:
выделение памяти для двумерного динамического массива
C++
22
int**ArrayForChange=newint*[stringAmount];
You see, что память выделяется не для данных типа int, а именно для указателей на данные типа int.
Далее выделяется память для каждого указателя. В этой памяти уже будут находиться данные типа int:
выделение памяти для двумерного динамического массива
C++
23
24
25
26
for(inti=0;i<stringAmount;i++)
{
ArrayForChange[i]=newint[columnAmount];
}
freeing memory, занимаемую двумерным массивом, надо быть внимательным. Освободить её надо обратным способом: сначала память в которой содержатся данные:
освобождение памяти двумерного динамического массива
C++
32
33
34
35
for(inti=0;i<stringAmount;i++)
{
delete[]ArrayForChange[i];
}
Потом память массива указателей:
освобождение памяти двумерного динамического массива
C++
36
delete[]ArrayForChange;
Если пропустить первый шаг – произойдет утечка памяти. Так как ячейки занимаемые данными, будут отмечены как зарезервированная память и не смогут использоваться в программе повторно.
Передавая двумерный массив в функцию, нам необходимо передать указатель на указатель.
Когда функция получает этот указатель на указатель, она далее может с ним работать, как с обычным двумерным массивом. Например используя вложенные циклы, отображать данные на экран, как показано в строках 44 – 52. Or enter data in cell array– strings 58 – 64.
The result of the program work:
4.7
41
40 thoughts on “Tasks and Solutions: Pointers C ++”
double* giveMemoryToArr(double* startPtr, int sizeOfArr); void fillArr(double* ptrArr, int sizeOfArr); void showArr(double* ptrArr, int sizeOfArr); double* freeMemory(double* ptrArr); Please explain these lines,why do we take a pointer to double,why void.
pointer must be of the same type it points to/stored type. just unnecessarily complicated the beginner 2 task. the array itself is a pointer. void because there is no need to return anything after the function has run, it's the same as return 0;
double* giveMemoryToArr(double* startPtr, int sizeOfArr);
void fillArr(double* ptrArr, int sizeOfArr);
void showArr(double* ptrArr, int sizeOfArr);
double* freeMemory(double* ptrArr);
Please explain these lines,why do we take a pointer to double,why void.
pointer must be of the same type it points to/stored type. just unnecessarily complicated the beginner 2 task. the array itself is a pointer. void because there is no need to return anything after the function has run, it's the same as return 0;