Обработка одномерных и двумерных массивов
void main()
{
int A[30],n;
srand(5000);
printf("Dimension? ");
scanf("%d",&n);
for (int i=0; i<n; i++)
{
A[i] = rand()%100;
printf("%d ",A[i]);
}
printf("\nsumma= %d ",sum(a, n));
}
Поcтроение треугольника Паcкаля
int k,l;
int Ma[10][10];
n=10;
Ma[0][0]=1;
for ( i=1; i<n; i++)
{ Ma[i][i]=1;
Ma[i][0]=1;
for (int j=1; j<i; j++)
Ma[i][j]=Ma[i-1][j-1]+Ma[i-1][j];
}
Поиск элемента с заданными характиристиками
Поиск элемента в массиве
int Flag = -1;
int X=A[2];
for ( int i=1; i<n; i++)
if (A[i] = X)
{ Flag = i;
break;
}
Переменные-указатели
Указатель – это переменная, которая содержит адрес памяти. Этот адрес как правило является адресом некоторой другой переменной.
Тип данных переменных, на который указывает указатель называется базовым типом данных. Стандартный вид объявления указателя:
Тип * имя
int *ip, *iq; // указатели на целые объекты
flоat *fp; // указатель на символьный объект
char *cp; // указатель на символьный объект
char *const ср; // константный указатель на char
char const* pc; //указатель на константу типа char
int x;
Oператоры для работы с указателями.
Унарные операторы * и & имеют более высокий приоритет, чем арифметические операторы,
Oператор & - это унарный оператор, возвращает адрес объекта.
Унарный оператор * возвращает значение переменной, находящейся по данному адресу. Для получения значение переменной х, адрес которой присвоен ip, нужно записать *р. Этот оператор называют оператором разыменования иликосвенного доступа.
Можно выполнять преобразование типов указателей.
float x=1., y, u;
float *px;
int *p;
px=&x;
p= (int*)&x;
y=*p;
u=*px;
Арифметические действия с указателями.
Над указателями можно выполнять следующие действия:
Вычитание указателей одного типа. В результате этой операции получается число типа int, которое указывает насколько один адрес смещен от другого в единицах, равных длине базового типа данных указателя.
К указателям можно применять операции ++, - -;
pm++; pn--;
К указателю можно применять суммирование или вычитание с целым числом.
pn=pn-2
pm=pm+4;
При обьявлении указателя желательно ему присвоить некоторое начальное значение. Если значение неизвестно, то присваивают NULL или 0, которое указывает, что указатель пока не используется.
Динамическое распределение памяти
Это можно выполнить двумя способами: с помощью функций языка C, и с помощью появившейся в C++ операции new.
Для выделения памяти в C используют следующие функции.
void * malloc(size_t size);
malloc выделяет в программе память размеров в size байт.
int *pi = (int *) malloc(N * sizeof(int));
void *calloc(size_t nitem, size_t size);
calloc выделяет память размеров в (nitems*size), при этом память обнуляется.
void *realloc(void*ptr, size_t size);
realloc перераспределяет память, на который указывает указатель ptr, до размера size байт.
Для освобождения памяти используют функцию void free(void*ptr);
free освобождает память, на который указывает ptr. Прототипы этих функций находятся в <stdlib.h>.
Динамическое выделение памяти под массив из N элементов типа int
int *pi = (int *) malloc(N * sizeof(int));
int *pi = new int[N];
Освобождение памяти, занятой этим массивом, выполняется соответственно операторами
free(pi); delete [] pi;
Двумерные массивы реализуются через указатели на указатели. Описание int a[10][10];
соответствует описанию int (*a)[10];
Двумерные массивы реализуются через указатели на указатели. Описание int a[10][10];
соответствует описанию int (*a)[10];
int **a;
Динамическое выделение памяти под двумерный массив размерности M на N.
1. Использование функции malloc требует записи следующего фрагмента программы:
int **mas;
mas = (int **) malloc(M * sizeof(int *));
for (int i=0; i<N: i++)
mas[i] = (int *) malloc(N * sizeof(int));
Для корректного освобождения памяти необходимо записать следующий фрагмент:
for (i=0; i<N: i++)
free(mas[i]);
free(mas);
2. Использование операций newи deleteприводит к аналогичным конструкциям:
int **mas = new int *[M]
for (int i=0; i<N; i++)
mas[i] = new int [N];
for (int i=0; i<N; i++)
delete [] mas[i];
delete [] mas;
Указатели и массивы
Имя массива - это константный указатель
Адрес массива можно присвоить обычному указателю
int *pa=a;
pa - адрес a[0],
*(pa+1) есть содержимое a[1]
a+i - адрес a[i],
*(pa+i) - содержимое a[i].
Элемент массива можно изображать как в виде указателя со смещением, так и в виде имени массива с индексом.
Между именем массива и указателем, выступающим в роли имени массива, существует одно различие.
Указатель - это переменная, поэтому можно написать pa=a или pa++.
Имя массива не является переменной, и записи вроде a=pa или a++ не допускаются.
Массивы-параметры
Для передачи массивов-параметров функций формальный параметр массив можно объявить тремя способами:
-указатель, тип которого будет совпадать с типом элементов массива;
int function (int *a, int n) {……}-массив с фиксированной длиной;
int function ( int a[20]) {……}-безразмерный массив.
int function ( int a[], int n) {……}
Когда двумерный массив используется как параметр функции, необходимо передать указатель на первый элемент. Функция, получающая двумерный массив должна как минимум определять размерность первого измерения. Формальный параметр двумерный массив можно объявить следующими способами:
· двумерный массив с фиксированной длиной;
int function ( int ma[100][100]){……} Для использования этой функции двумерный массив должен быть описан с максимальной размерностью int Ma[100][100], но можно обрабатывать размерности n*m.
· двумерный с фиксированной размерностью первого измерения, т.е. второй размерностью; int func ( int ma[][100]) {…}Для использования этой функции двумерный массив должен быть описан со второй размерностью =100
· указатель, которому при вызове буде соответствовать адрес первого элемента двумерного массива;
int func ( int *ma) {……} В этом случае массив должен быть точно такой же размерности, как при вызове.
· указатель на двумерный массив, тип которого будет совпадать с типом элементов массива. int func ( int **ma) {……}- двумерный массив должен быть описан как указатель на указатель, для int **ma необх.ВыделитьПамятьНекоторойРазмерности n*m,но можно<= n*m размерности <= n*m.