Указатель на массив указателей и указатель на массив
Следует отметить, что с помощью скобок () в языке Си можно создавать указатели разных типов. Существуют указатели на массивы указателей и указатели на массивы заданного типа и заданного числа элементов.
Например:
int ** p1; // Указатель на массив указателей
int (*p2)[10]; // Указатель на массив из 10 элементов типа int
При выполнении арифметических операций с такими указателями будет происходить следующее:
p2++; // Значение адреса увеличится на 40=4*10 в Win32
Это происходит потому, что при выполнении арифметических операций с указателями за единицу принимается размер объекта в памяти, на который указывает указатель.
В заключение представим пример программы, которая выполняет сортировку элементов массива в порядке неубывания. При сортировке используется алгоритм прямого выбора: в массиве размерности n ищется минимальный элемент, потом минимальный элемент меняется местами с первым элементом, после этого первый элемент будет на своем месте; на следующем шаге рассматривается массив размерности на единицу меньший (без первого элемента) к нему применяется тот же алгоритм, и т.д. Массив в программе создается динамически, размерность вводится с клавиатуры, заполняется случайными числа и выводится на печать до сортировки и после сортировки.
#include <stdio.h>
#include <stdlib.h>
void main()
{
int *pM; // Указатель на массив
int n; // Число элементов массива
printf("n="); scanf("%d", &n); // Ввод числа элементов
// Выделение памяти для массива
pM=(int *)malloc(n*sizeof(int));
// Заполняем массив псевдослучайными числами в интервале 0..99
for(int i=0; i<n; i++) pM[i]=rand() % 100;
// Печатаем исходный массив
for(int i=0; i<n; i++) printf("%d ", pM[i]);
for(int i=0; i<n-1; i++) // Считаем, что массив начинается с i-го
// элемента
{
int imin=i, // Индекс миниамльного элемента
// (считаем минимальным i-ый элемент)
min=pM[i]; // Значение минимального элемента
// Сравниваем выбранный элемент со всеми последующими
for(int j=i+1; j<n; j++)
if (pM[j]<min) // Нашли элемент меньший чем min
{
min=pM[j];
imin=j;
}
// Минимальный элемент меняем с i-m
pM[imin]=pM[i];
pM[i]=min;
}
// Пеачть массива после сортировки
printf("\n"); // Переход на новую строчку
for(int i=0; i<n; i++) printf("%d ", pM[i]);
}
Указатель – это переменная, которая хранит адрес участка памяти, выделенного для объектов определенных типов.
Ссылка– это переменная, представляющая новое имя уже существующего объекта, ссылка по своей сути является указателем, но к ней нет необходимости применять операцию * (обращение по адресу) при обращении к объекту, любое обращение к ссылке приводит к обращению к объекту, на который ссылается ссылка.
Массив– это производный тип, представляющий собой множество элементов, все элементы массива имеют один и тот же тип и следуют в памяти друг за другом.
Строка– это символьный массив, заканчивающийся символом с кодом 0 (символ NULL) – это служебный символ, являющийся признаком конца строки.