c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...
目錄
預編譯
值傳遞、指針傳遞、引用傳遞
數組
typedef 函數指針
預編譯
預編譯又叫預處理。預編譯不是編譯,而是編譯前的處理。這個操作是在正式編譯之前由系統自動完成的。#define 和 #include 一樣,都是以“#”開頭的。凡是以“#”開頭的均為預處理指令。
#define 宏定義。其定義一個標識符來表示一個常量。其特點是:定義的標識符不占內存,只是一個臨時的符號,預編譯后這個符號就不存在了。在頭文件的開頭,常使用宏定義來防止頭文件的重復包含,此時宏定義只有宏值,沒有宏名。宏值和宏名是可以分離的。
#define定義常量和const變量的區別。
最大的區別是const 變量依然是變量,是只允許被讀的變量。在C語言中,其作為數組長度的定義會報錯。這一點在不同的C語言版本和C++中都存在區別。
值傳遞、指針傳遞、引用傳遞
int?a = 3, b = 5;int *A = &a;? int *B?= &b;
1. 函數申明?f(int a, int b);? ?函數調用 f(a, b)? ? ? // 值傳遞。
2. 函數申明 f(int *A, int * B);? 函數調用 f(&a, &b), f(A, B)? ? // 指針傳遞, 實際上傳遞的還是形參的值,不過這個值是地址。是int變量a, b的地址,也是指針變量A和B的地址。
3. 函數申明 f(int &a, int &b);? ? 函數調用 f(a, b)? ? // 引用傳遞 , ? 傳遞的是形參的地址。實參是兩個整型變量,但傳遞的實際是他們地址。引用傳遞,子函數的調用不會為形參開辟新的內存,對形參的處理等于直接修改實參的值。
數組
數組在C語言中不是基本數據結果。不能直接賦值,不能作為函數類型返回。
盡量使用定長數組。int arr[] = {0}實際是1個元素的定長數組。int arr[0]可以表示不定長數組。
數組名和指針的區別:數組名表示數組的首地址,但是數組名包含了數組除首地址外的其他的信息。當數組作為形參傳遞時,這一點比較明顯。但不管以下那種函數申明方式,當數組名作為實參傳遞的都是地址。
int?a[10] = {0};? int *A = a;
1. 函數申明 sort(int?a[10]),sort(int?a[]);? 函數調用 sort(a);? // 數組作為形參,數組名作為實參。函數的調用傳入的實參會當做數組首地址使用。子函數內部對數組的使用,可以不受函數形參數組大小10的限制,函數調用數組長度也不受形參限制。
2. 函數申明?sort(int *A);? 函數調度sort(a);? 或者 sort(A);? ? // 此處子函數內部不包含數組信息,為了方便使用,有時候講函數變形為sort(int *A,? int num), 帶上另外一個參數表示數組長度。此種調用方式,數組名a被修改為了一個純粹的指針。
3. 函數申明 sort(int (&a)[10]);? 函數調用 sort(a);? // 引用作為形參,數組名作為實參。子函數sort包括的數組長度信息不會消失。函數調用時必須傳入一個長度為10的數組名。這種方式保留了數組的長度信息。因為引用是只用使用的實參地址,沒有形參到實參的一個變量類型強制過程。
typedef 函數指針
typedef常用數據類型意義不大,而且容易出現一些錯誤。但是函數在C語言中不是一種類型,卻可以通過typedef來定義一種特定的類型。使函數在C語言中的使用變得靈活,可以作為數組結構體的一個元素等使用。類型定義的語法可以歸結為一句話:只要在變量定義前面加上typedef,就成了類型定義。這兒的原本應該是變量的東西,就成為了類型。其核心區別還是變量定義和類型申明的區別。
int integer;???? //整型變量
int *pointer;?? //整型指針變量
int array [5]; //整型數組變量
int *p_array [5]; //整型指針的數組的變量
int (*array_pointer) [5];//整型數組的指針的變量
int (*function) (int param);//現在就是指向函數的指針了
若要定義相應類型,即為類型來起名字,就是下面的形式:
typedef int integer_t;? ? ? ?//整型類型
typedef int *pointer_t;???? //整型指針類型
typedef int array_t [5]; //整型數組類型
typedef int *p_array_t [5];??? //整型指針的數組的類型
typedef int (*array_pointer_t) [5]; //整型數組的指針的類型
typedef int (*function_t) (int param); //指向函數的指針的類型
typedef在語法上是一個存儲類的關鍵字(如auto、extern、mutable、static、register等一樣),雖然它并不真正影響對象的存儲特性。因此typedef不能和其他的存儲類關鍵字同時使用。
typedef后的類型跟其他關鍵字配合時,跟正常類型會出現區別。
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;? ?// p1++是合法的
const pStr p2 = string;? // 此處const修飾的時 p2, p2++是非法的;
利用函數指針實現封裝性,得到類似于C++的類,獲取面向對象的效果
struct _Data;
typedef void (*process)(struct _Data* pData);
typedef struct _Data
{
int value;
process pProcess;
}Data;
封裝性的意義在于,函數和數據是綁在一起的,數據和數據是綁在一起的。這樣,我們就可以通過簡單的一個結構指針訪問到所有的數據,遍歷所有的函數。封裝性,這是類擁有的屬性,當然也是數據結構體擁有的屬性。當結構體中即包含了數據,也包含了對數據的操作和使用,則結構體就獲得了類擁有的封裝性屬性。
總結
以上是生活随笔為你收集整理的c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高倍数泡沫装置PHP_泡沫灭火系统,了解
- 下一篇: mysql 备份_MySQL数据库备份实