用typedef定義數組

 

看《effetive c++》,發現未曾用typedef定義過數組,趕緊google學習考證下:

 

可以此代碼驗證:

 23 #include "stdio.h"

 24 #include "stdlib.h"

 25 

 26 #define NUM 100

 27 

 28 int main()

 29 {

 30     typedef char Adds[NUM];

 31 

 32     Adds add1;

 33 

 34     cout << sizeof(add1) / sizeof(char) << endl;

 35 

 36     return 0;

 37 }

期望輸出: 100 (NUM定義的值)

 

 

http://dev.csdn.net/htmls/18/18670.html

typedef到處都是,但是能夠真正懂得typedef使用的不算太多。對於初學者而言,看別人的源碼時對到處充斥的typedef往往不知所錯,而參考書又很少,所以在此給出一個源碼,供大家參考

 

#include <stdio.h>

#include <iostream.h>

 

/* 避免Visual Cfor與標準for的不同 */

#define for  if (0);   else for (這個沒看懂)

 

/* dim(a)是用於計算a的維數,不過只能計算數組的維數,不能計算指針的維數 */

#define dim(a) (sizeof(a)/sizeof(a[0]))

 

/* N1N4是幾個常量,以枚舉的形式定義 */

enum {N1 = 2, N2 = 3, N3 = 4, N4 = 5};

 

/* 這個C程序員都知道,就是將DataType定義爲int型,便於擴充 */

typedef int DataType;

 

/* 定義一個一維數組,數組的元素維整型值 */

typedef DataType ARR1[N4];

 

/* 再定義一個一維數組,數組的元素維ARR1型,不過ARR1又是一個數組,所以

 * ARR2 實際上是一個矩陣

 */

typedef ARR1 ARR2[N3]; /* 此處完全等價爲typedef int ARR2[N3][N4];*/

 

/* 按照ARR2的解釋,ARR3也是一個一維數組,不過數組元素的類型是ARR2的類型

 * 所有ARR3是一個三維數組

 */

typedef ARR2 ARR3[N2]; /* 此處完全等價爲typedef int ARR3[N2][N3][N4];*/

 

/* 分別用定義好的ARR1ARR2ARR3定義三個變量a, b, c */

ARR1 a; /* 此處完全等價於:int a[N4]; */

ARR2 b; /* 此處完全等價於:int b[N3][N4]; */

ARR3 c; /* 此處完全等價於:int c[N2][N3][N4]; */

 

/* 下面函數給大家個示例看a,b,c如何使用 */

void exam_1()

{

    for (int i=0; i<dim(a); i++) a[i] = i+1;

 

    for (int i=0; i<dim(b); i++) for (int j=0; j<dim(b[0]); j++)

        b[i][j] = (i+1)*10 + (j+1);

 

    for (int i=0; i<dim(c); i++) for (int j=0; j<dim(c[0]); j++)

        for (int k=0; k<dim(c[0][0]); k++) c[i][j][k] = (i+1)*100 + (j+1)*10 + (k+1);

 

    printf("/nThe a is :/n");

    for (int i=0; i<dim(a); i++) printf("%4d ", a[i]);

    printf("/n");

 

    printf("/nThe b is :/n");

    for (int i=0; i<dim(b); i++)

    {

        for (int j=0; j<dim(b[0]); j++) printf("%4d ", b[i][j]);

        printf("/n");

    }

 

    printf("/nthe c is:/n");

    for (int i=0; i<dim(c); i++)

    {

        for (int j=0; j<dim(c[0]); j++)

        {

            for (int k=0; k<dim(c[0][0]); k++) printf("%4d ", c[i][j][k]);

            printf("/n");

        }

        printf("/n");

    }

}

 

/* 下面函數給大家演示數組在內存中的排列 */

void exam_2()

{

    int *pn = NULL;

 

    pn = (int *)a; /* 等價於 pn = &a[0]; */

    printf("/nThe a is :/n");

    for (int i=0; i<sizeof(a)/sizeof(DataType); i++) printf("%4d ", pn[i]);

    printf("/n");

 

    pn = (int *)b; /* 等價於 pn = &b[0][0]; */

    printf("/nThe b is :/n");

    for (int i=0; i<sizeof(b)/sizeof(DataType); i++) printf("%4d ", pn[i]);

    printf("/n");

 

    pn = (int *)c; /* 等價於 pn = &c[0][0][0]; */

    printf("/nThe c is :/n");

    for (int i=0; i<sizeof(c)/sizeof(DataType); i++) printf("%4d ", pn[i]);

    printf("/n");

}

 

 

 

int main(int argc, char* argv[])

{

    exam_1();

    exam_2();

    return 0;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章