天天看點

數組類型和多元數組本質

1數組概念

 1)元素類型角度:數組是相同類型的變量的有序集合 測試指針變量占有記憶體空間大小

 2)記憶體角度:聯系的一大片記憶體空間

數組初始化

數組元素的個數可以顯示或隐式指定, 分析數組初始化{0}與memset比較。

{0} 與memset 耗時差不多,但{0} 可能有移植性問題,雖然絕大多數編譯器看到{0} 都是将數組全部初始化為0, 但是不保證所有編譯器都是這樣實作的;推薦使用memset方法。

數組名的技術盲點

 1)數組首元素的位址和數組位址是兩個不同的概念

 2)數組名代表數組首元素的位址,它是個常量。

 解釋如下:變量本質是記憶體空間的别名,一定義數組,就配置設定記憶體,記憶體就固定了。是以數組名起名以後就不能被修改了。

 3)數組首元素的位址和數組的位址值相等

 4、怎麼樣得到整個一維數組的位址?

C語言規定:

Int a[10];

printf(“得到整個數組的位址a: %d \n”, &a);

printf(“數組的首元素的位址a: %d \n”, a);

2數組類型、數組指針類型、數組指針類型變量

數組類型

 1資料類型分為基礎、非基礎,思考角度應該發生變化

 2 C語言中的數組有自己特定的類型

 數組的類型由元素類型和數組大小共同決定

 例:int array[5]的類型為int[5]

typedef int(MYINT5)[5];   //int
    typedef float(MYFLOAT10)[10];
    數組定義:
    MYINT5i Array;   int array[5];
    MYFLOAT10fArray
           

數組指針類型

 數組指針用于指向一個數組。

定義數組指針 有三種

1)通過數組類型定義數組指針:

typedef int(ArrayType)[5]; int *a

ArrayType* pointer;

{
    int a[5];
    //聲明一個數組類型
    typedef int(MYINT5)[5];
    //用數組類型 加*,定義一個數組指針變量
    MYINT5 *array;
    array = &a;
    for (i=0; i<5; i++)
    {
        (*array)[i] = i;
    }
    //
    for (i=0; i<5; i++)
    {
        printf("\n%d %d", a[i], (*array)[i]);
    }
}
           

2) 聲明一個數組指針類型

typedef int (*MyPointer)[5];

MyPointer myPoint;

{
    int b[5];
    //聲明一個數組指針類型
    typedef int (*MyPointer)[5];
    //用數組指針類型,去定義一個變量
    MyPointer mypoint ;
    mypoint= &b;    
    for (i=0; i<5; i++)
    {
        (*mypoint)[i] = i;
    }
    //
    for (i=0; i<5; i++)
    {
        printf("\n%d %d", b[i], (*mypoint)[i]);
    }
}
           

3)直接定義:int (*pointer)[n];

pointer 為數組指針變量名

type 為指向的數組的類型

n 為指向的數組的大小

{
    int c[5];
    //直接聲明一個數組指針變量
    int (*pointer)[5] = &c;
    for (i=0; i<5; i++)
    {
        (*pointer)[i] = i;
    }
    for (i=0; i<5; i++)
    {
        printf("\n%d %d", c[i], (*pointer)[i]);
    }
}
           

3多元數組本質技術推演

void main222()
{
int a[3][5];

int c[5]; //&c + 1;  表示指針向後移4*5個機關
int b[10]; //b代表數組首元素的位址 &b代表這個數組的位址 &b+1相當于 指針後移4*10個機關

//a的本質是一個數組指針,每次往後跳一維的維數    
printf("a:%d, a+1:%d \n", a, a+1); //4*5
}
           

char cbuf[30]; // cbuf(1級指針) 代表數組首元素的位址。&cbuf(二級指針) 代表整個數組的位址.

char array[10][30]; //array是二級指針

array 二維數組的首位址

(array+i) //相當于 整個第i行的數組位址 //二級指針 &cbuf

(*(array+i))//一維數組的首位址 cbuf

(*(array+i))+j //相當于第i行第j列的位址《==》&array[i][j]

*((*(array+i))+j) //相當于第i行第j列的值<====>array[i][j]