C语言enum(枚举)、指针、函数指针
-
C enum(枚舉)
枚舉是c語言中的一種數(shù)據(jù)類型,定義格式為
enum 枚舉名{枚舉元素1,枚舉元素2,......};用#define定義一星期七天,就要為每個整數(shù)定義一個別名
#define MON 1 #define TUE 2 #define WED 3 #define THU 4 #define FRI 5 #define SAT 6 #define sun 7用枚舉的方式定義一星期七天
enum DAY {MON=1, TUE, WED, THU, FRI, SAT, SUN };第一個枚舉成員的默認(rèn)值為整型的0,后續(xù)枚舉成員的值在前一個成員上加1
可以在定義枚舉類型時改變枚舉元素的值
enum season {spring, summer=3, autumn, winter};spring的值為0,summer的值為3,autumn的值為4
枚舉變量的定義
在C語言中枚舉是被當(dāng)作int或者unsigned int 類型處理
枚舉類型必須連續(xù)才可以實現(xiàn)有條件的遍歷
#include<stdio.h>enum DAY {MON=1, TUE, WED, THU, FRI, SAT, SUN } day;int mian() {for (day = MON; day <= SUN; day++){printf("枚舉元素:%d\n",day);} }以上輸出結(jié)果為
枚舉元素:1 枚舉元素:2 枚舉元素:3 枚舉元素:4 枚舉元素:5 枚舉元素:6 枚舉元素:7枚舉在switch中的使用
#include<stdio.h> #include<stdlib.h> int mian() {enum color { red=1; green; blue };enum color favorite_color;printf("請輸入你喜歡的顏色:(1.red,2.green,3.blue):");scanf("%d",&favorite_color);switch(favorite_color){case red:printf("你喜歡的顏色是紅色");break;case green:printf("你喜歡的顏色是綠色");break;case blue:printf("你喜歡的顏色是藍(lán)色");break;default:printf("你沒有選擇你喜歡的顏色");}return 0; }將整數(shù)轉(zhuǎn)換為枚舉
#include<stdio.h> #include<stdlib.h>int main() {enum day{MON, TUE, WED, THU, FRI, SAT, SUN}workday;int a=1;enum day weekend;weekend = ( enum day ) a; //類型轉(zhuǎn)換 printf("weekend:%d",weekend);return 0; }-
C指針
指針是一個變量,其值為另一個變量的地址,即內(nèi)存位置的直接地址
所有的實際數(shù)據(jù)類型,不管是整型、浮點型,還是其他的數(shù)據(jù)類型,對應(yīng)指針的值的類型都是一樣的,都是一個代表內(nèi)存地址的長的十六進制數(shù)
不同數(shù)據(jù)類型的指針之間唯一的不同是,指針?biāo)傅淖兞炕虺A康臄?shù)據(jù)類型不同
#include<stdio.h>int main() {int var = 20;int *ip;ip = &var; /* 在指針變量中存儲var的地址 */printf("Adress of var variable : %p\n",&var);/* 在指針變量中存儲的地址 */printf("Adress stored in ip variable : %p\n",ip);/* 使用指針訪問值 */printf("Value of *ip variable : %d\n",*ip);return 0; }編譯執(zhí)行后,結(jié)果為
Adress of var variable : bffd8b3c Adress stored in ip variable : bffd8b3c Value of *ip variable : 20- C中的NULL指針
在聲明變量的時候,如果沒有確切的地址可以賦值,為指針變量賦一個NULL值是一個好習(xí)慣。賦值NULL值的指針被稱為空指針
NULL指針是一個定義在標(biāo)準(zhǔn)庫中的值為零的常量
#include<stdio.h>int main() {int *ptr = NULL;printf("ptr的地址是:%p\n",ptr);return 0; }編譯執(zhí)行后
ptr的地址是:0x0在大多數(shù)操作系統(tǒng)上,程序不允許訪問地址為0的內(nèi)存,因為該內(nèi)存是操作系統(tǒng)保留的。然而,內(nèi)存地址0有特別重要的意義,它表明該指針不指向一個可訪問的內(nèi)存位置。但照慣例,如果指針包含空值(零值),則假定它不指向任何東西
檢查一個空指針,可以用if語句
if(ptr) /* 如果p非空,則完成 */ if(!ptr) /* 如果p為空,則完成 */遞增一個指針
使用指針代替數(shù)組,因為變量指針可以遞增,而數(shù)組不能,數(shù)組可以看成一個指針變量
遞減一個指針
對指針進行遞減運算,即把值減去其數(shù)據(jù)類型的字節(jié)數(shù),如下所示:
- 指針的比較
只要變量指針?biāo)赶虻牡刂沸∮诨虻扔跀?shù)組的最后一個元素的地址&var[MAX-1],則把變量指針進行遞增
-
C指向指針的指針
指向指針的指針是一種多級間接尋址的形式,或者說是一個指針鏈。通常,一個指針包含一個變量的地址。當(dāng)我們定義一個指向指針的指針時,第一個指針包含了第二個指針的地址,第二個指針指向包含實際值的位置 -
C傳遞指針給函數(shù)
傳遞一個無符號的long型指針給函數(shù),并在函數(shù)內(nèi)改變這個值:
能夠接收指針作為參數(shù)的函數(shù),也能接收數(shù)組作為參數(shù)
#include<stdio.h> double getAverage(int *arr,int size);int main() {int balance[5]={1000,2,3,17,50);double avg;avg = getAverage(balance,5); //傳遞一個指向數(shù)組的指針作為參數(shù)printf("Average value is:%f\n".avg);return 0; }double getAverage(int *arr,int size) {int i,sum=0;double avg;for (i=0; i<size; ++i){sum += arr[i];}avg = (double)sum/size;return avg; }-
C函數(shù)指針
函數(shù)指針是指向函數(shù)的指針變量
函數(shù)指針可以像一般函數(shù)一樣,用于調(diào)用函數(shù)、傳遞參數(shù)
函數(shù)指針變量的聲明:
一下實例聲明了函數(shù)指針變量p,指向函數(shù)max:
#include<stdio.h>int max(int x,int y) {return x > y ? x : y; }int main(void) {int(*p)(int,int) = &max; //&可以省略int a,b,c,d;printf("Please enter three numbers:");scanf("%d%d%d",&a&b&c);/* 與直接調(diào)用函數(shù)等價,d=max(max(a,b),c) */d = p(p(a,b),c);printf("max is:%d\n",d);return 0; }- 回調(diào)函數(shù)
函數(shù)指針作為某個函數(shù)的參數(shù)
函數(shù)指針變量可以作為某個函數(shù)的參數(shù)來使用的,回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)
實例中populate_array函數(shù)定義了三個參數(shù),其中第三個參數(shù)是函數(shù)的指針,通過該函數(shù)來設(shè)置數(shù)組的值
實例中定義了回調(diào)函數(shù)getNextRandomValue,它返回一個隨機值,它作為一個函數(shù)指針傳遞給populate_array函數(shù)
populate_array將調(diào)用10次回調(diào)函數(shù),并將回調(diào)函數(shù)的返回值賦值給數(shù)組
#include<stdio.h> #include<stdlib.h>//回調(diào)函數(shù) void populate_array(int *array, size_t arraySize, int (*getNextValue)(void)) {for (size_t i=0; i<arraySize; i++)array[i]=getNextValue(); }//獲取隨機值 int getNextRandomValue(void) {return rand(); }int main(void) {int myarray[10];populate_array(myarray, 10, getNextRandomValue);for(int i = 0; i<10; i++){printf("%d",myarray[i]);}printf("\n");return 0; }總結(jié)
以上是生活随笔為你收集整理的C语言enum(枚举)、指针、函数指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 草果的功效与作用及禁忌的功效与作用(草果
- 下一篇: dnf100版本强韧的亡灵结晶(强韧的亡