Читайте также: |
|
Массивы
Пример.
int n;
float *a;
printf(“n=”); scanf(“%d”,&n);
a=(float * ) malloc(n*sizeof(float)); // другой вариант
// a=(float * ) сalloc(n, sizeof(float));
Спросили у пользователя n и разместили в динамической памяти массив из n элементов типа float.
После окончания работы с массивом память необходимо освободить free(a);
Возможен вариант в стиле C++:
int n;
float *a;
cout<<“n=”; cin>>n;
a=new int[n]; // Выделяем память.
… // Поработали с массивом
delete [] a; // Освобождаем память
С элементами массива можно работать как с обычными переменными, т. е. присваивать им значения (a[3] = 5.0;), спрашивать их значения у пользователя (scanf(“%f”, &a[2]); или cin >> a[2];), печатать (printf(“%6.2f”,a[2]); или cout << a[2]);) и т.п.
Массивы и указатели.
Адрес переменной – это номер ячейки памяти, в которой она расположена.
Указатель – это переменная, предназначенная для хранения адреса некоторого объекта (например, другой переменной).
Объявление указателя:
int *p; // Объявили указатель p на переменную целого типа.
// Теперь в p можно хранить адрес переменной типа int.
Для работы с указателями есть 2 операции:
Amp; - взятие адреса
снятие адреса (разадресация).
Если x – переменная, то &x – ее адрес.
Если p – указатель на переменную, то *p - значение этой переменной.
Имя массива – это адрес его нулевого элемента.
Пусть объявлен массив:
int a[5]={7,3,5,4,2};
Тогда a – это то же самое, что и &a[0].
*a – это то же самое, что и a[0]. В нашем случае *a = 7.
К указателю можно прибавить число.
Если a – это адрес элемента a[0], то a+3 – это адрес элемента a[3].
Операция сложения с константой учитывает размер адресуемых элементов.
Другими словами, если a – указатель на переменную типа int (т.е. номер ячейки, в которой содержится переменная типа int), то прибавление тройки увеличивает этот номер на 3*sizeof(int).
Таким образом,
a+3 – это то же самое, что и &a[3].
*(a+3) – это то же самое, что и a[3].
На самом деле, увидев обращение a[3], машина перепишет его в виде индексного выражения *(a+3).
Пример.
int a[5]={3,2,7,6,5};
printf(“%d”, 3[a]);
Что будет напечатано?
Выражение 3[a] будет переписано в виде *(3+a), это равно *(a+3), то есть a[3]. Будет напечатано число 6.
Указатели можно вычитать.
Пример.
int a[5]={3,2,7,6,5};
int *p1, *p2;
int m;
p1=&a[1];
p2=&a[4];
m=p2-p1;
В результате m=3.
Двумерные массивы
Пусть задан двумерный массив из m строк и n столбцов. Есть различные способы получения доступа к его элементам. Чтобы получить доступ к элементу из i-й строки и j-го столбца матрицы a, достаточно написать a[i][j].
Как и в одномерном случае, имя массива является адресом его нулевого элемента a[0][0]. Учитывая, что элементы массива располагаются в памяти подряд, для доступа к a[i][j] можно использовать индексное выражение *(a+n*i+j).
Можно обратиться к элементу массива и другими способами: *(*(a+i)+j) или *(a[i]+j).
Можно несколькими способами выделять динамическую память под двумерный массив.
При выделении памяти сразу под весь массив количество строк можно задавать с помощью переменной или выражения:
int m,n;
cout << “m=”;
cin >> m;
cout << “n=”;
cin >> n;
int **a = new int *[m];
for(int i=0; i<m; i++)
a[i] = new int [n];
Дата добавления: 2015-07-11; просмотров: 83 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Программа на ЯВУ ТР7.0 | | | Функции от матриц. |