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

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

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

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

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

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

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

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

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

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

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

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

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

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

40 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];//

    1. double* pArrForFill = 0
      мы создаем указатель но он просто пустой
      //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;
    }
    }

  5. Задача № 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;
    }

  6. Задача №3
    я вижу решение такое, более простое как мне кажется
    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(mas);
    for (int i = 0; i < 12; i++)
    {
    cout << " | " << mas[i];
    }
    }

  7. А не проще ли сделать решение 3 задачи так?:
    //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++) { //after
    cout << p[i] << endl;
    }

    }

    int main()
    {
    const int size = 12;
    int* pArr = new int[size];
    for (int i = 0; i < size; i++) { //before
    pArr[i] = i + 1;
    cout << pArr[i] << endl;
    }

    cout << "=======================" << endl;

    swapOddAndShow(pArr, size);

    delete[] pArr;
    }
    Вообще-то у меня опыта немного, поэтому я могу ошибаться.

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

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