Масив покажчиків у C
У C масив покажчиків — це однорідна колекція індексованих змінних покажчиків, які є посиланнями на місце пам’яті. Зазвичай він використовується в програмуванні на C, коли ми хочемо вказати на кілька ділянок пам’яті подібного типу даних у нашій програмі на C. Ми можемо отримати доступ до даних, розіменувавши вказівник, що вказує на них.
Синтаксис:
pointer_type *array_name [array_size];
тут,
- pointer_type: тип даних, на які вказує вказівник. array_name: назва масиву покажчиків. array_size: Розмір масиву покажчиків.
Примітка: Важливо пам’ятати про пріоритет оператора та асоціативність у масиві оголошень покажчиків різного типу, оскільки одна зміна означатиме зовсім інше. Наприклад, введення *array_name у круглі дужки означатиме, що array_name є покажчиком на масив.
приклад:
C
// C program to demonstrate the use of array of pointers> #include> int> main()> {> > // declaring some temp variables> > int> var1 = 10;> > int> var2 = 20;> > int> var3 = 30;> > // array of pointers to integers> > int> * ptr_arr[3] = { &var1, &var2, &var3 };> > // traversing using loop> > for> (> int> i = 0; i <3; i++) {> > printf> (> 'Value of var%d: %d Address: %p
'> , i + 1, *ptr_arr[i], ptr_arr[i]);> > }> > return> 0;> }> |
Вихід
Value of var1: 10 Address: 0x7fff1ac82484 Value of var2: 20 Address: 0x7fff1ac82488 Value of var3: 30 Address: 0x7fff1ac8248c
Пояснення:
Як показано в прикладі вище, кожен елемент масиву є покажчиком, що вказує на ціле число. Ми можемо отримати доступ до значення цих цілих чисел, спочатку вибравши елемент масиву, а потім розіменувавши його, щоб отримати значення.
Масив покажчиків на символ
Одним із основних застосувань масиву покажчиків є зберігання кількох рядків у вигляді масиву покажчиків на символи. Тут кожен покажчик у масиві є покажчиком на символ, який вказує на перший символ рядка.
Синтаксис:
char *array_name [array_size];
Після цього ми можемо призначити цим покажчикам рядок будь-якої довжини.
приклад:
C
char> * arr[5]> > = {> 'gfg'> ,> 'geek'> ,> 'Geek'> ,> 'Geeks'> ,> 'techcodeview.com'> }> |
Цей метод зберігання рядків має перевагу традиційного масиву рядків. Розглянемо наступні два приклади:
Приклад 1:
C
// C Program to print Array of strings without array of pointers> #include> int> main()> {> > char> str[3][10] = {> 'Geek'> ,> 'Geeks'> ,> 'Geekfor'> };> > printf> (> 'String array Elements are:
'> );> > for> (> int> i = 0; i <3; i++) {> > printf> (> '%s
'> , str[i]);> > }> > return> 0;> }> |
Вихід
String array Elements are: Geek Geeks Geekfor
У наведеній вище програмі ми оголосили 3 рядки та 10 стовпців нашого масиву рядків. Але через попередньо визначений розмір масиву рядків споживання простору програмою збільшується, якщо пам’ять не використовується належним чином або залишається невикористаною. Тепер давайте спробуємо зберегти ті самі рядки в масиві покажчиків.
приклад 2:
C
// C program to illustrate the use of array of pointers to> // characters> #include> int> main()> {> > char> * arr[3] = {> 'geek'> ,> 'Geeks'> ,> 'Geeksfor'> };> > for> (> int> i = 0; i <3; i++) {> > printf> (> '%s
'> , arr[i]);> > }> > return> 0;> }> |
Вихід
geek Geeks Geeksfor
Тут загальна використана пам’ять — це пам’ять, необхідна для зберігання рядків і покажчиків, не залишаючи, таким чином, жодного порожнього місця, заощаджуючи багато втраченого простору. Ми можемо зрозуміти це, використовуючи зображення, показане нижче.
Простір, зайнятий масивом покажчиків на символи, показаний суцільними зеленими блоками, за винятком пам’яті, необхідної для зберігання покажчика, тоді як простір, зайнятий масивом рядків, включає суцільні та світло-зелені блоки.
Масив покажчиків на різні типи
Ми можемо не лише визначити масив покажчиків для основних типів даних, таких як int, char, float тощо, але також можемо визначити їх для похідних і визначених користувачем типів даних, таких як масиви, структури тощо. Давайте розглянемо наведений нижче приклад, де ми створюємо масив покажчиків, що вказують на функцію для виконання різних операцій.
приклад:
C
// C program to illustrate the use of array of pointers to> // function> #include> // some basic arithmetic operations> void> add(> int> a,> int> b) {> > printf> (> 'Sum : %d
'> , a + b);> }> void> subtract(> int> a,> int> b) {> > printf> (> 'Difference : %d
'> , a - b);> }> void> multiply(> int> a,> int> b) {> > printf> (> 'Product : %d
'> , a * b);> }> void> divide(> int> a,> int> b) {> > printf> (> 'Quotient : %d'> , a / b);> }> int> main() {> > int> x = 50, y = 5;> > // array of pointers to function of return type int> > void> (*arr[4])(> int> ,> int> )> > = { &add, &subtract, &multiply, ÷ };> > for> (> int> i = 0; i <4; i++) {> > arr[i](x, y);> > }> > return> 0;> }> |
Вихід
Sum : 55 Difference : 45 Product : 250 Quotient : 10
Застосування масиву покажчиків
Масив покажчиків корисний у багатьох випадках. Деякі з цих програм наведено нижче:
- Найчастіше використовується для зберігання кількох рядків.
- Він також використовується для реалізації LinkedHashMap у C, а також у техніці Chaining для вирішення колізій у Hashing.
- Він використовується в алгоритмах сортування, як сортування по відрах.
- Його можна використовувати з будь-яким типом покажчика, тому він корисний, коли у нас є окремі оголошення кількох сутностей і ми хочемо зберегти їх в одному місці.
Недоліки масиву покажчиків
Масив покажчиків також має достатню частку недоліків, і його слід використовувати, коли переваги переважають недоліки. Деякі з недоліків масиву покажчиків:
- Більше споживання пам’яті: масив покажчиків вимагає більше пам’яті порівняно з простими масивами через додатковий простір, необхідний для зберігання покажчиків. Складність: використання масиву покажчиків може бути складним у порівнянні з простим масивом. Схильність до помилок: Оскільки ми використовуємо вказівники, усі помилки, пов’язані з покажчиками, приходять із ними, тому нам потрібно з ними поводитися обережно.
Пов'язана стаття: Покажчик на масив | Покажчик масиву