Шаг 39.
Примеры использования указателей при работе с массивами

    На этом шаге мы рассмотрим несколько примеров совместного использования указателей и массивов.


    Пример 1. Ввод пяти элементов одномерного массива без использования цикла.
   #include<iostream.h>
   int a[5],*uk;
   main ()
   {
      uk = &a[0];
      cin >> *(uk) >> *(uk+1) >> *(uk+2) >> *(uk+3) >> *(uk+4);
      cout << *(uk) << " " << *(uk+1) << " " << *(uk+2) << " " 
                                    << *(uk+3) << " " << *(uk+4);
   }
Текст этой программы можно взять здесь.


    Пример 2. Определение разности между наибольшим и наименьшим элементами массива.
   #include<iostream.h>
   main ()
   {
      int u,y,s,a[20],*ukazatel=&a[0];
      /* ---------------------- */
      for (int w=0; w<=5; w++)
      {
         cout << "\n Вводите элемент массива... ";
         cin >> *(ukazatel+w);
      }
      u = y = *ukazatel;
      for (w=0; w<=5; w++)
      {
         if  (y<=*(ukazatel+w)) y = *(ukazatel+w);
         else
           if (u>=*(ukazatel+w)) u = *(ukazatel+w);
      }
      cout << y-u << endl;
   }
Текст этой программы можно взять здесь.


    Пример 3. Вычисление среднего арифметического элементов массива.
   #include<iostream.h>
   main ()
   {
      int a[20],*ukazatel = &a[0];
      for (int w=0; w<=3; w++)
      {
         cout << "Введите очередной элемент массива: ";
         cin >> *(ukazatel+w);
      }
      int y = 0;
      for (w=0; w<=3; w++)
         y = y + *(ukazatel+w);
      cout << "Среднее арифметическое  = " << float(y)/w;
   }
Текст этой программы можно взять здесь.


    Пример 4. Определение последнего элемента заданного числового массива, меньшего 3.
   #include<iostream.h>
   main ()
   {
      int a[20],*ukazatel = &a[0];
      cout << "Программа выводит последнее число, меньшее 3" << endl;
      for (int w=0; w<=3; w++)
      {
         cout << "Вводи число... ";
         cin >> *(ukazatel+w);
      }
      cout << "\n Элемент: ";
      int y = 3,f=0;
      for (w=3; w>=0; w--)
	if  (y > *(ukazatel+w))
	{
		cout << *(ukazatel+w); f=1; break;
	}
      if (!f) cout << "таких элементов нет.";
   }
Текст этой программы можно взять здесь.


    Пример 5. Сортировка массива символов.
   #include<iostream.h>
   #define n 10
   main ()
   {
      char m[n],*p=m,temp;
      /* ------- */
      cout << "\n Вводи " << n << " символов для сортировки" << endl;
      for (unsigned i=0; i> *(m+i);
      cout << "\n Исходный массив m[i],i=1," << n << ":\n";
      for (i=0; i<n; i++)
         cout << *(p+i);
      cout << "\n Начало сортировки:\n";
      for (unsigned k=0; k<n-1; k++)
      {
         for (i=k+1; i<n; i++)
            if  (*p>*(m+i))
            {
               temp = *p; *p = *(m+i); *(m+i) = temp;
            }
         p++;
      }
      cout << "\n";
      cout << "\n Упорядоченный массив m[i],i=1," << n << ":\n";
      cout << "(распечатка с использованием *(m+i))\n";
      for (i=0; i<n; i++)
         cout << *(m+i) << ",";
      cout << "\n Упорядоченный массив m[i],i=1," << n << ":\n";
      cout << "(распечатка с использованием *(p+i))\n";
      for (i=0; i<n; i++)
         cout << *(p+i) << ",";
   }
Текст этой программы можно взять здесь.

    Результат работы программы:

   Вводи 10 символов для сортировки
   fywaproldv
   Исходный массив m[i],i=1,10:
   f,y,w,a,p,r,o,l,d,v,
   Начало сортировки:
   Упорядоченный массив m[i],i=1,10:
   (распечатка с использованием *(m+i))
   a,d,f,l,o,p,r,v,w,y,
   Упорядоченный массив m[i],i=1,10:
   (распечатка с использованием *(p+i))
   y, ,н, , ,ц,Ь,у, ,о,

    В конце программы упорядоченный массив m[] распечатывается дважды, причем второй вариант (с обращением к элементам массива *(p+i)) является ошибочным, поскольку указатель p на массив m[] изменялся в цикле (конструкция p++;) и к рассматриваемому моменту указывает уже не на начало массива m, а на его последний элемент.


    Пример 6. Простые ссылки и массивы. Что напечатает следующая программа?
   #include<iostream.h>
   int a[] = { 0,1,2,3,4 };
   main ()
   {
      int *p;
      for (int i=0; i<=4; i++)
         cout << "a[" << i << "]=" << a[i] << "  ";      /* Печать 1 */
      cout << endl;
      for (p=&a[0]; p<=&a[4]; p++)
         cout << "*p=" << *p << "  ";                    /* Печать 2 */
      cout << endl;
      for (p=&a[0],i=1; i<=5; i++)
         cout << "p[" << i << "]=" << p[i] << "  ";      /* Печать 3 */
      cout << endl;
      for (p=a,i=0;p+i<=a+4;p++,i++)
         cout << "*(p+" << i << ")=" << *(p+i) << "  ";  /* Печать 4 */
      cout << endl;
      for (p=a+4; p>=a; p--)
         cout << "*p=" << *p << "   ";                   /* Печать 5 */
      cout << endl;
      for (p=a+4,i=0; i<=4; i++)
        cout << "p[" << 4-i << "]=" << p[-i] << "  ";    /* Печать 6 */
      cout << endl;
      for (p=a+4;p>=a;p--)
        cout << "a[" << p-a << "]=" << a[p-a] << "  ";   /* Печать 7 */
      cout << endl;
   }
Решение и комментарии вы можете посмотреть здесь.

    На следующем шаге мы остановимся более подробно на массивах указателей.


Предыдущий шаг Содержание Следующий шаг