Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Використання кваліфікатора const в оголошеннях параметрів

Поиск

Якщо аргументом функції є адреса деякого фактичного параметра, то така функція оперує безпосередньо з цим параметром і може змінювати його значення. В багатьох випадках така зміна небажана або взагалі недопустима. Щоб захистити значення фактичного параметра від змін, спричинених помилковим записом у тілі функції якихось даних за адресою цього параметра, треба в оголошенні відповідного формального аргументу вказати кваліфікатор const. Компілятор зафіксує кожну спробу запису даних в константний параметр, а також спробу присвоєння адреси цього параметру внутрішньому вказівнику, оголошеному без кваліфікатора const. Крім цього ключове слово const обов’язкове в тих формальних параметрів-вказівників, яким будуть присвоюватись адреси фактичних параметрів, оголошених з кваліфікатором const.

 

#include "string.h"

#include <iostream>

using namespace std;

void inc1(int * a, int * b) {

*a += *b;

}

void inc2(int * a, const int * b) {

*a += *b;

}

int main() {

const int N = 2;

int x = 1;

inc1(&x, &N);

inc2(&x, &N);

cout << x << endl;

}

 

При спробі виклику функції inc1 виникає помилка «Типи const int * i int * несумісні».

Якщо формальний параметр-вказівник оголосити з кваліфатором const, записаним безпосередньо перед іменем вказівника, то компілятор стежитиме, щоб у тілі функції значення цього вказівника не змінювалось. Наприклад:

 

void f1(const int * p){

int a;

*p = 123; // помилка

p = &a;    // помилки немає

}

void f2(int * const p) {

int a;

*p = 123; // помилки немає

p = &a; // помилка

}

void f3(const int * const p) {

int a;

*p = 123; // помилка

p = &a;    // помилка

cout << *p; // помилки немає

}

Багатовимірні масиви як параметри функцій

Мова С++ розглядає багатовимірні масиви як масиви, елементами яких є підмасиви меншої вимірності. Тому, якщо багатовимірний масив треба передавати в функцію для опрацювання, то відповідний формальний параметр функції має бути вказівником на перший підмасив цього багатовимірного масиву.

Як і у випадку одновимірних масивів, для оголошення формальних параметрів, що відповідають багатовимірним масивам, можна застосовувати дві форми:

 

тип_елементв ім’я_масиву [ ] [к-сть_елементів_1]…[к-сть_елементів_n]

тип_елементв (* ім’я_масиву) [к-сть_елементів_1]…[к-сть_елементів_n]

 

В обох формах оголошення треба обов’язково вказувати кількість елементів для кожного виміру масиву, крім першого. Багатовимірний масив зберігається в оперативній пам'яті як послідовність підмасивів. Тому для знаходження адреси певного елемента (чи порядкового номеру елемента в масиві) за значенням його індексів треба знати розмірність кожного виміру цього масиву.

Вказівникова форма оголошення параметра, що є багатовимірним масивом, вимагає використання круглих дужок, оскільки операція * має нижчий пріоритет, ніж операція [ ]. Без круглих дужок відповідний параметр буде масивом вказівників на тип_елементів, а не вказівником на підмасив заданого багатовимірного масиву.

Для прикладу використання різних форм звертання до багатовимірних масивів створимо декілька функцій, які будуть заповнювати двовимірний масив випадковими числами, виводити його на екран, та знаходити найбільший елемент цього масиву.

 

#ifndef ARRAY2D_H

#define ARRAY2D_H

#include <iostream>

using namespace std;

#define NCOLS 4

#define NROWS 3

void array2d_fill(int m[ ][ NCOLS ]) {

for (int i = 0; i < NROWS; i++)

     for (int j = 0; j < NCOLS; j++)

           m[ i ][ j ] = rand() % 100;

}

void array2d_print(int (* m)[ NCOLS ]) {

int (* prow)[ NCOLS ], * pelem;

for (prow = m; prow - m < NROWS; prow++) {

     for (pelem = *prow; pelem - *prow < NCOLS; pelem++)

           cout << *pelem << "\t";

     cout << endl;

}

}

int array2d_max(int * m) {

int max = *m;

int num = NCOLS * NROWS;

for (int i = 0; i < num; i++, m++)

     if (max < *m)

           max = *m;

return max;

}

#endif

#include "array2d.h"

#include <iostream>

using namespace std;

int main() {

int a[ NROWS ][ NCOLS ];

array2d_fill(a);

array2d_print(a);

cout << array2d_max(a[ 0 ]) << endl;

}

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 33; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.21.237 (0.005 с.)