配列保護配列の内容


配列を処理する関数では、ポインタのみが渡されます.配列の変更を防止するために、constキーを関数パラメータ宣言で宣言できます.しかし、これは関数に対して配列を修正できないだけで、元の配列の修正は宣言時の状況を見なければなりません.
 
   
   
   
   
  1. #include 
  2. #define SIZE 3 
  3. int sum(const int ar[],int n); 
  4.  
  5. int main(void){ 
  6.     int num[] = {1,2,3}; 
  7.     int answer = sum(num,sizeof(num)/sizeof(num[0])); 
  8.     printf("%d
    "
    ,answer); 
  9.     num[0] = 2;// , const! 
  10.     printf("%d
    "
    ,num[0]); 
  11.     return 0; 
  12.  
  13. int sum(const int ar[],int n){ 
  14.     int result = 0; 
  15.     int index; 
  16.  
  17.     for(index=0;index
  18.         result += ar[index]; 
  19.     } 
  20.     //ar[0] = 2; ! const  
  21.     return result; 

constキーワードの役割
1.配列定数を作成できます
2.定数を指すポインタを作成できます.このポインタは値の変更には使用できませんが、他のアドレスを指すことができます.
3.定数ポインタを作成できます.このポインタは他のアドレスを指すことはできませんが、値の変更に使用できます.
4.定数を指す定数ポインタを作成できます.このポインタは値を変更することも、他のアドレスを指すこともできません.
注意のルール
1.定数または非常量のデータのアドレスを定数を指すポインタに割り当てるのは合法的である
2.通常のポインタに付与できるのは、非常量のデータのアドレスのみです
3.したがって、関数パラメータはconstのポインタとして宣言され、通常の配列も定数配列も受信でき、両方のパラメータは定数ポインタに割り当てることができる.逆にconstと宣言されたポインタがなく、普通の配列しか受け入れられず、定数配列は受け入れられません!
 
   
   
   
   
  1. #include 
  2.  
  3. int main(void){ 
  4.     const int array1[] = {1,2,3};//  
  5.     int array2[] = {1,2,3} 
  6.  
  7.     //array1[0] = 2; , ; 
  8.  
  9.     const int *pd = array2;//  
  10.     //*pd = 2; ,  
  11.     array2[0] = 2;// , array2  
  12.     pd++;// ,pd ,  
  13.  
  14.     double rates[5] = {1,2,3,4,5}; 
  15.     const double locked[5] = {1,2,3,4,5}; 
  16.     const double *pc =rates;//  
  17.     double *pnc = rates;//  
  18.     pc = locked;//  
  19.     //pnc = locked; ,  
  20.     double const *pncc = rates; 
  21.     *pncc = 2;//  
  22.     pcnn++;// ,  
  23.     const double const *pnccc = rates;// ,