日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...

發布時間:2025/3/12 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。