КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Масиви та вказівники
Ініціалізація масивів Приклад оголошення символьного масиву. char str[] = "оголошення символьного масиву"; Слід враховувати, що в символьному літералі знаходиться на один елемент більше, оскільки останній з елементів є управляючою послідовністю '\0'. Ініціалізувати масив можна кількома шляхами: 1) за допомогою вводу з клавіатури; 2) за формулою; 3) явно. Ініціалізація з клавіатури: int A[12] ………… For (i=0; i<12; i++) { printf (“vv. El-t № % d”, i); Scanf (“%d”, &A[i]); } Ініціалізація явно: Int I; Int A [12]={0 7 3 12 14 32 0 7 -2 0 1 12}; ……………………….. For (i=0; i<12; i++); printf (“vv. el-t № %d:”, i); Явно двомірний масив: int A [4] [3]= {{ 1 7 9 } {0 4 9 } {9 9 0 }{-7 13 -3}} _____________ Int i, j; Int A [4][3] For (i=0; i<4; i++) For (j=0; j<3; j++) {scanf (“%i”, & A [i] [j]); Як було сказано вище, між масивами та вказівниками існує тісний зв'язок. Ім’я масиву без квадратних дужок є вказівником на перший елемент масиву. Data [ ], data- адреса першого елементу масиву. Може виникнути питання якими чином, якщо для отримання адреси, перед іменем потрібно поставити амперсанд? Це вірно. Отримати адресу першого елементу масиву можна і таким чином: & data[0] В мові С справедливе співвідношення: data= = &data[0] Таким чином, ім’я масиву – вказівник на його перший елемент. До того ж це ім’я є постійним вказівником (адресою константою): тобто, його не можна змінити і воно лишається фіксованим під час виконання програми. В цьому випадку є здоровий глузд: якщо змінити значення вказівника, то він буде вказувати кудись в інше місце, а не на масив, котрий залишиться в пам’яті там же, де він і був. В прикладі змінна – вказівник p_array ініціалізується адресою першого елементу масиву array[] Int array[100], * p_array; p_array = array; Так, як p_array - змінна-вказівник, і можна замінити таким чином, щоб вона вказувала на задану адресу. На відміну від імені масиву array, змінна p_array не прив’язана до початку масиву array[].Покажчики на багатовимірні масиви Покажчики на багатовимірні масиви в мові СІ - це масиви масивів, тобто такі масиви, елементами яких є масиви. При оголошенні таких масивів в пам'яті комп'ютера створюється декілька різних об'єктів. Наприклад при виконанні оголошення двовимірного масиву int arr2[4][3] в пам'яті виділяється ділянка для зберігання значення змінної arr, яка є покажчиком на масив з чотирьох покажчиків. Для цього масиву з чотирьох покажчиків теж виділяється пам'ять. Кожний з цих чотирьох покажчиків містить адресу масиву з трьох елементів типу int, і, отже, в пам'яті комп'ютера виділяється чотири ділянки для зберігання чотирьох масивів чисел типу int, кожний з яких складається з трьох елементів. Таке виділення пам'яті показане на схемі на рис.3.
Таким чином, оголошення arr2[4][3] породжує в програмі три різні об'єкти: покажчик з ідентифікатором arr, безіменний масив з чотирьох покажчиків і безіменний масив з дванадцяти чисел типу int. Для доступу до безіменних масивів використовуються адресні вирази з покажчиком arr. Доступ до елементів масиву покажчиків здійснюється з вказівкою одного індексного виразу у формі arr2[2] або *(arr2+2). Для доступу до елементів двовимірного масиву чисел типу int повинні бути використані два індексні вирази у формі arr2[1][2] або еквівалентних їй *(*(arr2+1)+2) і (*(arr2+1))[2]. Слід враховувати, що з погляду синтаксису мови СІ покажчик arr і покажчики arr[0], arr[1], arr[2], arr[3] є константами і їх значення не можна змінювати під час виконання програми. Розміщення тривимірного масиву відбувається аналогічно і оголошення float arr3[3][4][5] породжує в програмі окрім самого тривимірного масиву з шістдесяти чисел типу float масив з чотирьох покажчиків на тип float, масив з трьох покажчиків на масив покажчиків на float, і покажчик на масив масивів покажчиків на float. При розміщенні елементів багатовимірних масивів вони розташовуються в пам'яті підряд по рядках, тобто найшвидше змінюється останній індекс, а повільніше - перший. Такий порядок дає можливість звертатися до будь-якого елементу багатовимірного масиву, використовуючи адресу його початкового елементу і лише один індексний вираз. Наприклад, звернення до елементу arr2[1][2] можна здійснити за допомогою покажчика ptr2, оголошеного у формі int *ptr2=arr2[0] як обіг ptr2[1*4+2] (тут 1 і 2 це індекси використовуваного елементу, а 4 це число елементів в рядку) або як ptr2[6]. Помітимо, що зовні схожий обіг arr2[6] виконати неможливо оскільки покажчика з індексом 6 не існує. Для звернення до елементу arr3[2][3][4] з тривимірного масиву теж можна використовувати покажчик, описаний як float *ptr3=arr3[0][0] з одним індексним виразом у формі ptr3[3*2+4*3+4] або ptr3[22]. Далі приведена функція, що дозволяє знайти мінімальний елемент в тривимірному масиві. У функцію передається адреса початкового елементу і розміри масиву, значення, що повертається, - покажчик на структуру, що містить індекси мінімального елементу.
Дата добавления: 2014-01-07; Просмотров: 2357; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |