c理解提高(1)資料型別的本質分析
阿新 • • 發佈:2018-10-31
資料型別本質分析
資料型別概念
- “型別”是對資料的抽象
- 型別相同的資料有相同的表示形式、儲存格式以及相關的操作
- 程式中使用的所有資料都必定屬於某一種資料型別
資料型別的本質思考
- 思考資料型別和記憶體有關係嗎?
- 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)若不是,也請說明原因。