配列の内容の保護

1544 ワード

intのような基本タイプを扱う関数を記述する際には、int数値を関数に伝達してもよいし、intを指すポインタを伝達してもよい.通常、数値を直接伝えます.ポインタは、関数がこの値を常に変更する必要がある場合にのみ渡されます.配列を処理する関数では、ポインタのみが渡されます.これは、プログラムの効率を向上させるためです.値によって関数に配列が渡される場合、関数には元の配列のコピーを格納するのに十分な記憶領域を割り当て、元の配列のすべてのデータをこの新しい配列にコピーする必要があります.配列のアドレスを簡単に関数に渡し、元の配列を直接読み書きさせると、プログラムの効率が高くなります.
この技術もいくつかの問題をもたらします.通常、Cは、元のデータの整合性を保証するため、データの値を伝達する.関数は、元のデータのコピーを使用します.これにより、元のデータを意図的に変更することはできません.ただし,配列を処理する関数は元のデータを直接操作するため,元の配列を修正することができる.これが必要な場合があります.たとえば、次の関数の機能は、配列内の各要素に同じ数値を加えることです.
void add_to(double ar[],int n,double val)
{
    int i;
    for(i=0;i

この関数は配列の内容を変更し,配列の内容を変更できるのは,関数がポインタを用い,元のデータを直接使用できるためである.
一、形式パラメータに対してconstを使用する
設計が関数が配列の内容を変更しないことを意図している場合、関数のプロトタイプと定義された形式パラメータでキーワードconstの合計使用を宣言できます.例えばsum()
のプロトタイプと定義は次のとおりです.
int sum(const int ar[],int n); //  
int sum(const int ar[],int n)  //   
{
    int i;
    int total=0;
    for(i=0;i

これはコンパイラに知らせる:関数はarが指す配列を定数データを含む配列として扱うべきである.このように、ar[i]++のような式を意外に使用すると、コンパイラはこのエラーを発見し、関数が定数を変更しようとすることを通知するエラー1メッセージを生成します.
このようにconstを使用すると、元のデータが固定されていることは要求されません.これは、関数が配列を処理する際に、配列を固定されているものと見なすべきであることを示しています.constを使用して配列を保護します.値による伝達が基本タイプを保護できるように、関数が呼び出し関数のデータを変更することを阻止します.要するに、関数が配列を変更したい場合は、配列パラメータを宣言するときにconstを使用しないでください.関数が配列を変更する必要がない場合は、配列パラメータを宣言するときにconstを使用することが望ましいです.
二、constに関するその他の内容
前述したようにconstを使用してシンボル定数を作成できます:const double PI=3.14159;
以上は、#defineコマンドを用いて実現してもよい.ただしconstを使用すると、配列定数、ポインタ定数、および定数を指すポインタを作成することもできます.