Основы программирования на С++ для начинающих

Задачи и решения: Указатели C++

Тему Указатели в C++ мы рассмотрели в двух статьях:

–  Часть 1: Указатели С++

– Часть 2: Указатели С++

Теперь вам придется много практиковаться, чтобы закрепить знания и до конца разобраться. Решим несколько задач для начала.

1.  Задачка элементарная, но требует хорошего понимания что такое указатели. Дан указатель: double **p = 0; Выполните следующие задания (решения можно оформлять внутри функции main):
* создайте конструкцию, изображенную на рисунке;
* выведите число, указанное в квадратике, на экран;
* после этого удалите все динамические объекты.

задача с решением, указатели С++

Опять же – ищем самое короткое решение. Автор:  

2. Объявите указатель на массив типа double и предложите пользователю выбрать его размер. Далее напишите четыре функции: первая должна выделить память для массива, вторая  – заполнить ячейки данными, третья – показать данные на экран, четвертая – освободить занимаемую память.  Программа должна предлагать пользователю продолжать работу (создавать новые динамические массивы ) или выйти из программы. 

3. Объявите указатель на массив типа int и выделите память память для 12-ти элементов. Необходимо написать функцию, которая поменяет значения четных и нечетных ячеек массива. Например есть массив из 4-х элементов:

задачи и решения указатели c++

задачи и решения указатели c++

4.  Объявить и заполнить двумерный динамический массив случайными числами от 10 до 50. Показать его на экран. Для заполнения и показа на экран написать отдельные функции. (подсказка: функции должны принимать три параметра – указатель на динамический массив, количество строк, количество столбцов).  Количество строк и столбцов выбирает пользователь.

33 thoughts on “Задачи и решения: Указатели C++

  1. Не понял решения первого задания
    Либо я плохо читал и смотрел видос, либо я просто что-то забыл, но как я понял, этот указатель – указатель на указатель, верно?
    То есть, одной строчкой кода мы создаем два указателя, один из которых указывает на другой указатель, который в свою очередь указывает на 2.
    Послушать так бред
    у меня много вопросов,
    Как указатель указывает просто на двойку? Или там еще и переменная создается?
    почему сначала, там нужно поставить * а потом нет?
    *(*(p = new double*) = new double) = 2;
    И что вообще происходит в этой строке я так и не разобрался
    Кто в этом разбирается помогите пожалуйста, ничего не понимаю

    1. Указателю p присваивается адрес динамически выделенной памяти в которой хранится указатель на double, далее мы разадресуем p и получаем указатель на тип double и динамически выделяем ему память, разадресацией получаем значение этой ячейки памяти (с double) и присваиваем ему значение 2.Можно записать по другому:
      p = new double*;
      *p=new double;
      **p=2;

      1. Спасибо, впринципе я примерно так и думал, только у меня в голове это казалось намного сложнее

  2. По 4 заданию можете подсказать из-за чего возникает эта ошибка
    “вызвал срабатывание точки останова”
    не каждый раз .

  3. Прочитал уроки и посмотрел видео до этого момента, со скрипом пытаюсь понять:
    по 2 задаче, //double* pArrForFill = 0;// как мы таким образом указатель на массив сделали? типо адресс первой ячейки?
    Еще, почему так:
    //double* giveMemoryToArr(double* ptrArr, int sizeOfArr)
    {
    ptrArr = new double[sizeOfArr];//
    а не вот так?
    //double* giveMemoryToArr(double* ptrArr, int sizeOfArr)
    {
    double* ptrArr = new double[sizeOfArr];//

  4. 3 задача:
    #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;
    }
    }

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *