Якщо аргументом функції є адреса деякого фактичного параметра, то така функція оперує безпосередньо з цим параметром і може змінювати його значення. В багатьох випадках така зміна небажана або взагалі недопустима. Щоб захистити значення фактичного параметра від змін, спричинених помилковим записом у тілі функції якихось даних за адресою цього параметра, треба в оголошенні відповідного формального аргументу вказати кваліфікатор 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; // помилки немає
}