1. 程式人生 > >c理解提高(1)資料型別的本質分析

c理解提高(1)資料型別的本質分析

資料型別本質分析


資料型別概念

  • “型別”是對資料的抽象
  •  型別相同的資料有相同的表示形式、儲存格式以及相關的操作
  •  程式中使用的所有資料都必定屬於某一種資料型別

 

資料型別的本質思考

  •  思考資料型別和記憶體有關係嗎?
  •  C/C++為什麼會引入資料型別?

 

資料型別的本質

  • 資料型別可理解為建立變數的模具(模子);是固定記憶體大小的別名
  • 資料型別的作用:編譯器預算物件(變數)分配的記憶體空間大小
  • 程式舉例,如何求資料型別的大小sizeof(int *)
  •  請問:資料型別可以有別名嗎?資料型別可以自定義嗎?

 

資料型別大小

int main()
{

    int a = 10;

    int b[10] ;

    printf("int a:%d \n", sizeof(a));

    printf("int a:%d \n", sizeof(int *));

    printf("int b:%d \n", sizeof(b));

    printf("int b:%d \n", sizeof(b[0]));

    printf("int b:%d \n", sizeof(*b));

    printf("hello.....\n");

    getchar();

    return 0;
}

//sizeof是操作符,不是函式;sizeof測量的實體大小為編譯期間就已確定

 

資料類型別名

  • 資料型別可以理解為固定大小記憶體塊的別名,請問資料型別可以起別名嗎?
int main()
{

         //Teacher t1;

         printf("Teacher:%d \n", sizeof(Teacher));

         printf("u32:%d \n", sizeof(u32));

         printf("u8:%d \n", sizeof(u8));

         printf("hello.....\n");

         getchar();

         return 0;

}

 

資料型別的封裝

  • 1、void的字面意思是“無型別”,void *則為“無型別指標”,void *可以指向任何型別的資料。
  • 2、用法1:資料型別的封裝

                 int InitHardEnv(void **handle);

     典型的如記憶體操作函式memcpy和memset的函式原型分別為

                  void * memcpy(void *dest, const void *src, size_t len);

                  void * memset ( void * buffer, int c, size_t num ); 

  • 3、用法2:  void修飾函式返回值和引數,僅表示無。

       如果函式沒有返回值,那麼應該將其宣告為void型

       如果函式沒有引數,應該宣告其引數為void

       int function(void)

       {return 1;}

  • 4、void指標的意義

      C語言規定只有相同型別的指標才可以相互賦值

      void*指標作為左值用於“接收”任意型別的指標

      void*指標作為右值賦值給其它指標時需要強制型別轉換

      int *p1 = NULL;

      char *p2 = (char *)malloc(sizoeof(char)*20);

  • 5、不存在void型別的變數

      C語言沒有定義void究竟是多大記憶體的別名

 

 

資料型別總結與擴充套件

  • 1、資料型別本質是固定記憶體大小的別名;是個模具,c語言規定:通過資料型別定義變數。
  • 2、資料型別大小計算(sizeof)
  • 3、可以給已存在的資料型別起別名typedef
  • 4、資料型別封裝概念(void 萬能型別)

 

思考1

C一維陣列、二維陣列有資料型別嗎?int array[10]。

若有,陣列型別又如何表達?又如定義?

若沒有,也請說明原因。

拋磚:陣列型別

1、陣列型別

2、陣列指標

3、陣列型別和陣列指標的關係

思考2

C語言中,函式是可以看做一種資料型別嗎?

a)若是,請說明原因

並進一步思考:函式這種資料型別,能再重定義嗎?

b)若不是,也請說明原因。