Теперь вам придется много практиковаться, чтобы закрепить знания и до конца разобраться. Решим несколько задач для начала.
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 ++”
В целом годно. Не вчитывался, посмотрел по диагонали. Картинки красивые.
Функции типа giveMemoryToArr я бы не писал (although, на вкус и цвет…). Если уж их оставлять, то ИМХО double* freeMemory(double* ptrArr) должна возвращать void. Зачем она возвращает у вас всегда ноль?
Пример бы какой-нибудь еще (более объемный)… Шашки (человек против человека) whether…
Админу огромное спасибо, за то, что дает не только задачи, а и решения с подробными комментариями к коду. Я читала уроки по C++ на нескольких сайтах. На вашем – мне нравится больше всего. Удобное содержание главной страницы, задачи с решениями на отдельной странице. При чем задачи сгруппированы по темам, а не все скопом и вперемешку. Не останавливайтесь! Write more! :)
Так-то наверное можно задачу 3 и без буферов решить: void mixmass(int sz, int *arr) { for (int i = 1; i < sz; i ) { if (arr[i] % 2 == 0) arr[i] = i-1; } } ————————————————————– for (int i = 0; i < sz; i ) { mass [i] = i+1; std::cout << mass [i] << std::ends; };
В первой задачи куча непонятных конструкций, в предыдущих уроках не было объяснений по них, так зачем же решать задачу способом, который не понятен ученикам?
В 1-й задаче вообще нет никаких “конструкций” – нужно только хорошо понимать то, what: a). указатель содержитадрес Togo, на что он указывает, b). а операцияразименования указателя (префиксная операция *) means: “взятьvalue Togo, на что указывает указатель”.
Это я знаю, это было в уроке.Но 4 string, где в скобках стоит void, вообще не могу понять, в уроках никогда в скобках ничего не было; String 6, где вообще ничего не понятно, таких конструкций в уроках не было. Задачи должны быть такими, что прочитав все предыдущие статьи их можно было легко понять. Но первая задача совсем не такая.
3 a task
#include using namespace std;
int main() { setlocale(LC_ALL, “rus”); system(“color E0”);
int* array = new int[12]; for (int i = 0; i < 12; i ) { array[i] = i + 1; cout << array[i] << " "; }
cout << endl;
int b = 0; int j = 1; int save = 0; for (int i = 0; i < 6; i ) { save = array[b]; array[b] = array[j]; array[j] = save;
b = b + 2; j = j + 2; }
for (int i = 0; i < 12; i ) { cout << array[i] << " "; }
Guys, если не сложно помогите с задачкой: Даны матрицы А и В размера k×m и m×l соответственно. Найти произведение АВ. Перемножение матриц реализовать в виде функции.
Сама задача умножения матриц – “если не сложно” (и даже элементарно – 2 nested loop). But: 1. Есть разные варианты представления 2-мерных матриц (как 2-х мерных массивов, как массивов указателей, как STL контейнеров – вектор векторов и т.д. … to 10 разных способов или более). В зависимости от выбранного способа вычисления будут записываться совсем по-разному. 2. Гораздо больше по объёму, чем само умножение, займёт у вас а). ввод исходных матриц + b). вывод результата + in). тестовая задача main() которая будет наглядно демонстрировать процесс и результат.
Так что задача очень простая, но писать всё для неё обрамление – совсем не просто, там механической работы много.
People, а если я хочу написать функция выделения памяти под двухмерный массив, как это выглядит.
int *givemmry (int **boob, int size1,int size2) { **boob = new int* [size1]; for (int i = 0; i < size1; i ) { boob[i] = new int[size2]; } return **boob; }
int** givemmry( int size1, int size2 ) { int **boob = new int* [ size1 ]; for( int i = 0; i < size1; i++ ) boob[ i ] = new int[ size2 ]; return boob; }
Или проще: int** givemmry( int size1, int size2 ) { return (int**)new int* [ size1 * size2 ]; }
В целом годно. Не вчитывался, посмотрел по диагонали. Картинки красивые.
Функции типа giveMemoryToArr я бы не писал (although, на вкус и цвет…).
Если уж их оставлять, то ИМХО double* freeMemory(double* ptrArr) должна возвращать void. Зачем она возвращает у вас всегда ноль?
Пример бы какой-нибудь еще (более объемный)… Шашки (человек против человека) whether…
В целом, well done. Пиши еще :)
Админу огромное спасибо, за то, что дает не только задачи, а и решения с подробными комментариями к коду. Я читала уроки по C++ на нескольких сайтах. На вашем – мне нравится больше всего. Удобное содержание главной страницы, задачи с решениями на отдельной странице. При чем задачи сгруппированы по темам, а не все скопом и вперемешку.
Не останавливайтесь! Write more! :)
Так-то наверное можно задачу 3 и без буферов решить:
void mixmass(int sz, int *arr)
{
for (int i = 1; i < sz; i )
{
if (arr[i] % 2 == 0)
arr[i] = i-1;
}
}
————————————————————–
for (int i = 0; i < sz; i )
{
mass [i] = i+1;
std::cout << mass [i] << std::ends;
};
mixmass(sz, mass);
Но уменя не доходит..
В первой задачи куча непонятных конструкций, в предыдущих уроках не было объяснений по них, так зачем же решать задачу способом, который не понятен ученикам?
В 1-й задаче вообще нет никаких “конструкций” – нужно только хорошо понимать то, what:
a). указатель содержит адрес Togo, на что он указывает,
b). а операция разименования указателя (префиксная операция *) means: “взять value Togo, на что указывает указатель”.
Это я знаю, это было в уроке.Но 4 string, где в скобках стоит void, вообще не могу понять, в уроках никогда в скобках ничего не было;
String 6, где вообще ничего не понятно, таких конструкций в уроках не было. Задачи должны быть такими, что прочитав все предыдущие статьи их можно было легко понять. Но первая задача совсем не такая.
3 a task
#include
using namespace std;
int main()
{
setlocale(LC_ALL, “rus”);
system(“color E0”);
int* array = new int[12];
for (int i = 0; i < 12; i )
{
array[i] = i + 1;
cout << array[i] << " ";
}
cout << endl;
int b = 0;
int j = 1;
int save = 0;
for (int i = 0; i < 6; i )
{
save = array[b];
array[b] = array[j];
array[j] = save;
b = b + 2;
j = j + 2;
}
for (int i = 0; i < 12; i )
{
cout << array[i] << " ";
}
Guys, если не сложно помогите с задачкой: Даны матрицы А и В размера k×m и m×l соответственно. Найти произведение АВ. Перемножение матриц реализовать в виде функции.
Сама задача умножения матриц – “если не сложно” (и даже элементарно – 2 nested loop).
But:
1. Есть разные варианты представления 2-мерных матриц (как 2-х мерных массивов, как массивов указателей, как STL контейнеров – вектор векторов и т.д. … to 10 разных способов или более). В зависимости от выбранного способа вычисления будут записываться совсем по-разному.
2. Гораздо больше по объёму, чем само умножение, займёт у вас а). ввод исходных матриц + b). вывод результата + in). тестовая задача main() которая будет наглядно демонстрировать процесс и результат.
Так что задача очень простая, но писать всё для неё обрамление – совсем не просто, там механической работы много.
People, а если я хочу написать функция выделения памяти под двухмерный массив, как это выглядит.
int *givemmry (int **boob, int size1,int size2)
{
**boob = new int* [size1];
for (int i = 0; i < size1; i )
{
boob[i] = new int[size2];
}
return **boob;
}
так он выдает ошибку
int** givemmry( int size1, int size2 ) {
int **boob = new int* [ size1 ];
for( int i = 0; i < size1; i++ )
boob[ i ] = new int[ size2 ];
return boob;
}
Или проще:
int** givemmry( int size1, int size2 ) {
return (int**)new int* [ size1 * size2 ];
}
Во 2-м решении копированием вкралась ошибка, должо быть, naturally:
int** givemmry( int size1, int size2 ) {
return (int**)new int [ size1 * size2 ];
}
Thank you! как я понял, не обязательно указывать тип и индекс массива (boob) в аргументе функции, мы просто возвращаем значение?
Здесь параметр оказывается просто лишний – вы его значение всё-равно затрёте после new, а тип его (и элементов массива) изменить всё-равно не можете.