typedef到處都是,但是能夠真正懂得typedef使用的不算太多。對于初學者而言,看別人的源碼時對到處充斥的typedef往往不知所錯,而參考書又很少,所以在此給出一個源碼,供大家參考。
懂得這些,基本上是 對typedef 合格了, 有時間,我會把c,c++中使用typedef的例子和標準中規定詳解解讀,敬請期待。
?
#include <stdio.h>
#include <iostream.h>
?
/* 避免Visual C的for與標準for的不同 */
#definefor? if (0);??elsefor
?
/* dim(a)是用于計算a的維數,不過只能計算數組的維數,不能計算指針的維數 */
#define dim(a) (sizeof(a)/sizeof(a[0]))
?
/* N1到N4是幾個常量,以枚舉的形式定義 */
enum {N1 = 2, N2 = 3, N3 = 4, N4 = 5};
?
/* 這個C程序員都知道,就是將DataType定義為int型,便于擴充 */
typedefint 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];*/
?
/* 分別用定義好的ARR1,ARR2,ARR3定義三個變量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;