Теперь вам придется много практиковаться, чтобы закрепить знания и до конца разобраться. Решим несколько задач для начала.
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 ++”
I do not understand the decision of the first task Either I have read and watched bad vidos, or I just forgot something, but as I understand, the pointer – a pointer to a pointer, верно? I.e, one line of code, we create two pointers, one of which points to another pointer, which in turn points to the 2. Listen as nonsense I have a lot of questions, As the pointer points to a deuce? Or there is also a variable is created? why first, there is need to put * and then there? *(*(p = new double*) = new double) = 2; And what's going on in this line, I did not understand Who understands this help please, I do not understand
P pointer is assigned an address dynamically allocated memory that stores a pointer to a double, Next we razadresuem p and obtain a pointer to type double, and dynamically allocates memory to him, razadresatsiey obtain the value of the memory cell (с double) and assign it a value 2.Can be written differently: p = new double*; *p=new double; **p=2;
Read the lessons and watched the video up to this point, I'm trying to understand with a squeak: по 2 task, //double* pArrForFill = 0;// how we made a pointer to an array in this way? like the address of the first cell? And, why is that: //double* giveMemoryToArr(double* ptrArr, int sizeOfArr) { ptrArr = new double[sizeOfArr];// not like this? //double* giveMemoryToArr(double* ptrArr, int sizeOfArr) { double* ptrArr = new double[sizeOfArr];//
double* pArrForFill = 0 we create a pointer but it is just empty //double* giveMemoryToArr(double* ptrArr, int sizeOfArr) { double* ptrArr = new double[sizeOfArr];// this way we re-create the pointer and why do we need to do this when we already have it and we pass it to the function?
task №3 I see a solution like this, simpler as it seems to me void fuu(int* pmas) { for (int i = 0; i < 12; i ) { pmas[i] = i + 1; cout << " | " << pmas[i]; } cout << "\n\n============================================\n\n"; for (int ix = 0; ix 0) pmas[ix] = pmas[ix] + 1; else pmas[ix] = pmas[ix] – 1; }
} void main() { setlocale(LC_ALL, “rus”); int * mas = new int[12]; fuu(but); for (int i = 0; i < 12; i ) { cout << " | " << but[i]; } }
Wouldn't it be easier to decide 3 tasks so?: //librayes #include //std using namespace std;
void swapOddAndShow(int* &p, int size) { for (int i = 0; i < size; i ) { if (p[i] % 2 == 0) { p[i – 1] = p[i]; p[i] = p[i – 1] – 1; } } for (int i = 0; i < size; i ) { //void swapOddAndShow cout << p[i] << endl; }
}
int main() { const int size = 12; void swapOddAndShow[size]; for (int i = 0; i < size; i ) { //void swapOddAndShow pArr[i] = i + 1; cout << pArr[i] << endl; }
I do not understand the decision of the first task
Either I have read and watched bad vidos, or I just forgot something, but as I understand, the pointer – a pointer to a pointer, верно?
I.e, one line of code, we create two pointers, one of which points to another pointer, which in turn points to the 2.
Listen as nonsense
I have a lot of questions,
As the pointer points to a deuce? Or there is also a variable is created?
why first, there is need to put * and then there?
*(*(p = new double*) = new double) = 2;
And what's going on in this line, I did not understand
Who understands this help please, I do not understand
P pointer is assigned an address dynamically allocated memory that stores a pointer to a double, Next we razadresuem p and obtain a pointer to type double, and dynamically allocates memory to him, razadresatsiey obtain the value of the memory cell (с double) and assign it a value 2.Can be written differently:
p = new double*;
*p=new double;
**p=2;
Thank you, in principle I like this and thought, only in my head, it seemed much more difficult
By 4 you can tell the task why this error occurs
“caused the breakpoint to fire”
not every time .
Read the lessons and watched the video up to this point, I'm trying to understand with a squeak:
по 2 task, //double* pArrForFill = 0;// how we made a pointer to an array in this way? like the address of the first cell?
And, why is that:
//double* giveMemoryToArr(double* ptrArr, int sizeOfArr)
{
ptrArr = new double[sizeOfArr];//
not like this?
//double* giveMemoryToArr(double* ptrArr, int sizeOfArr)
{
double* ptrArr = new double[sizeOfArr];//
double* pArrForFill = 0
we create a pointer but it is just empty
//double* giveMemoryToArr(double* ptrArr, int sizeOfArr)
{
double* ptrArr = new double[sizeOfArr];//
this way we re-create the pointer and why do we need to do this when we already have it and we pass it to the function?
3 a task:
#include
using namespace std;
void fillArr(int* parr);
int main()
{
setlocale(LC_ALL, “rus”);
int arr[12]{};
cout << "Массив до функции:\n";
cout << "___________________________\n";
for (int i = 0; i < 12; i )
{
arr[i] = i + 1;
cout << arr[i] <<"|";
}
fillArr(arr);
cout << "\n___________________________\n";
cout << "\nМассив после функции: \n";
cout << "___________________________\n";
for (int i = 0; i < 12; i )
{
cout << arr[i] << "|";
}
cout << "\n___________________________\n";
return 0;
}
void fillArr(int* parr)
{
for (int i = 1; i < 12; i = 2)
{
int j = parr[i – 1];
parr[i – 1] = parr[i];
parr[i] = j;
}
}
Problem No. 3
#include
using namespace std;
void FillArray(int* arr, int size)
{
for (int i = 0; i < size; i )
{
arr[i] = rand() % 100;
}
}
void OutputArray(int* arr, int size)
{
for (int i = 0; i < size; i )
{
cout << i+1 << ": " << arr[i] << "\t";
}
cout << endl;
}
int main()
{
int size = 12;
int* arr = new int[size];
FillArray(arr, size);
OutputArray(arr, size);
for (int i = 0; i < size; i )
{
if ((i+1) % 2 == 0)
{
arr[i] = arr[i] + arr[i – 1];
arr[i – 1] = arr[i] – arr[i – 1];
arr[i] = arr [i] – arr[i – 1];
}
}
OutputArray(arr, size);
return 0;
}
task №3
I see a solution like this, simpler as it seems to me
void fuu(int* pmas)
{
for (int i = 0; i < 12; i )
{
pmas[i] = i + 1;
cout << " | " << pmas[i];
}
cout << "\n\n============================================\n\n";
for (int ix = 0; ix 0)
pmas[ix] = pmas[ix] + 1;
else
pmas[ix] = pmas[ix] – 1;
}
}
void main()
{
setlocale(LC_ALL, “rus”);
int * mas = new int[12];
fuu(but);
for (int i = 0; i < 12; i )
{
cout << " | " << but[i];
}
}
Wouldn't it be easier to decide 3 tasks so?:
//librayes
#include
//std
using namespace std;
void swapOddAndShow(int* &p, int size) {
for (int i = 0; i < size; i ) {
if (p[i] % 2 == 0) {
p[i – 1] = p[i];
p[i] = p[i – 1] – 1;
}
}
for (int i = 0; i < size; i ) { //void swapOddAndShow
cout << p[i] << endl;
}
}
int main()
{
const int size = 12;
void swapOddAndShow[size];
for (int i = 0; i < size; i ) { //void swapOddAndShow
pArr[i] = i + 1;
cout << pArr[i] << endl;
}
cout << "=======================" << endl;
void swapOddAndShow(pArr, size);
delete[] pArr;
}
void swapOddAndShow, void swapOddAndShow.
crayon-6237e54a7c45b171657637/ “Frequency Dictionary of Words “