C言語知識点(四)---配列

7857 ワード

配列の基本概念
•要素タイプ角度:配列は同じ種類の変数の規則的な集合である•メモリ角度:連続した大きなメモリ領域
配列名
配列ヘッダ要素のアドレスと配列アドレスは、2つの異なる概念配列名が配列ヘッダ要素を表すアドレスであり、定数である.変数の本質はメモリ空間の別名であり,配列を定義するとメモリが割り当てられ,メモリが固定される.だから配列名を付けてからは修正できません.配列ヘッダのアドレスと配列のアドレス値が等しい
    int a[10];
printf("         a: %d 
"
, &a); printf(" a: %d
"
, a);

int a[10]というデータ型をどのように表現しますか?
配列タイプ
配列のタイプは、要素タイプと配列サイズで決まります.
int array[5]        int[5];
#include 

/*
   typedef int(MYINT5)[5];   
   typedef float(MYFLOAT10)[10];

       :

   MYINT5       iArray;      int iArray[5];
   MYFLOAT10    fArray;      float fArray[10];
 */

/*       ,          */
int main(void)
{
    typedef int(MYINT5)[5];
     int i = 0;

    MYINT5 array;

    for (i=0; i<5; i++) 
    {                       
        array[i] = i;                   
    }                                       

    for (i=0; i<5; i++) 
    {                           
        printf("%d ", array[i]);            
    }                                           

    return 0;                   
}

ポインタ配列
char *point_array[4];

ポインタ配列は、配列で、中の各要素はポインタです.(複数のポインタ)
アレイポインタ
int (*array_point)[4];
     ,      。(    )

ケース:
#include 

int main(int)
{
    int a[3][5], i=0, j=0;

    // a         ?
        printf("a %d , a+1:%d ", a, a+1);       
        //a+1     20    5*4
        printf("&a %d , &a+1:%d ", &a, &a+1);   
         //&+1     5*4*3 = 60

    //                         
    //               

    //              
int (*pArray)[5] ;   //          4       32bit      

pArray = a;
    for (i=0; i<3; i++)
    {
        for (j=0; j<5; j++)
        {
            printf("%d ", pArray[i][j]);
        }
    }

    // (a+i)                      i          
    // *(a+i)                  1      i       
    // *(a+i) + j  ===> &  (a[i][j])
    //*( *(a+i) + j) ===>   a[i][j]    

    return 0;
}

多次元配列の表現形式
#include 

    void printArray01(int a[3][5])
    {
        int i, j;
        for (i=0; i<3; i++)
        {
            for (j=0; j<5; j++)
            {
                printf("%d ", a[i][j]);
            }
        }
    }

    void printArray02(int a[][5])
    {
        int i, j;
        for (i=0; i<3; i++)
        {
            for (j=0; j<5; j++)
            {
                printf("%d ", a[i][j]);
            }
        }
    }

    void printArray03( int (*b)[5])
    {
        int i, j;
        for (i=0; i<3; i++)
        {
            for (j=0; j<5; j++)
            {
                printf("%d ", b[i][j]);
            }
        }
    }

    int main(void)
    {
        int a[3][5], i=0, j=0;
        int tmp = 1;

        for (i=0; i<3; i++)
        {
            for (j=0; j<5; j++)
            {
                a[i][j] = tmp++;
            }
        }

        printArray03(a);

        return 0;
    }

パラメトリックがポインタに劣化した原因1:高効率原因2:C言語でa[n]を処理する場合、nが何であるかを知ることができず、&n[0]がどれだけであるかしか知らず、その値がパラメータとして伝達され、c言語は直接int fun(char a[20])を行うことができ、関数は20という数字を得ることができるが、Cはそうしなかった.