-
C enum(枚举)
枚举是c语言中的一种数据类型,定义格式为
enum 枚举名{枚举元素1,枚举元素2,......};
用#define定义一星期七天,就要为每个整数定义一个别名
#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
};
第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1
可以在定义枚举类型时改变枚举元素的值
enum season {spring, summer=3, autumn, winter};
spring的值为0,summer的值为3,autumn的值为4
枚举变量的定义
- 先定义枚举类型,再定义枚举变量
enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;
- 定义枚举类型的同时定义枚举变量
enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
- 省略枚举名称,直接定义枚举变量
enum
{MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
在C语言中枚举是被当作int或者unsigned int 类型处理
枚举类型必须连续才可以实现有条件的遍历
#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);}
}
以上输出结果为
枚举元素: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("你喜欢的颜色是蓝色");break;default:printf("你没有选择你喜欢的颜色");}return 0;
}
将整数转换为枚举
#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; //类型转换 printf("weekend:%d",weekend);return 0;
}
-
C指针
指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址
所有的实际数据类型,不管是整型、浮点型,还是其他的数据类型,对应指针的值的类型都是一样的,都是一个代表内存地址的长的十六进制数
不同数据类型的指针之间唯一的不同是,指针所指的变量或常量的数据类型不同
#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;
}
编译执行后,结果为
Adress of var variable : bffd8b3c
Adress stored in ip variable : bffd8b3c
Value of *ip variable : 20
- C中的NULL指针
在声明变量的时候,如果没有确切的地址可以赋值,为指针变量赋一个NULL值是一个好习惯。赋值NULL值的指针被称为空指针
NULL指针是一个定义在标准库中的值为零的常量
#include<stdio.h>int main()
{int *ptr = NULL;printf("ptr的地址是:%p\n",ptr);return 0;
}
编译执行后
ptr的地址是:0x0
在大多数操作系统上,程序不允许访问地址为0的内存,因为该内存是操作系统保留的。然而,内存地址0有特别重要的意义,它表明该指针不指向一个可访问的内存位置。但照惯例,如果指针包含空值(零值),则假定它不指向任何东西
检查一个空指针,可以用if语句
if(ptr) /* 如果p非空,则完成 */
if(!ptr) /* 如果p为空,则完成 */
递增一个指针
使用指针代替数组,因为变量指针可以递增,而数组不能,数组可以看成一个指针变量
#include<stdio.h>
const MAX = 3;int main()
{int var[] = {100,10,200};int i, *ptr;ptr = var; //指针中的数组地址for ( i=0; i<MAX; i++){printf("存储地址:var[%d] = %x\n",i,ptr);printf("存储值:var[%d] = %d\n",i,*ptr);ptr++;}return 0;
}
递减一个指针
对指针进行递减运算,即把值减去其数据类型的字节数,如下所示:
#include<stdio.h>const int MAX = 3;
int main()
{int var[]={10,100,200};int i,*ptr;ptr = &var[MAX-1]; // 指针中最后一个元素的地址for (i=MAX; i>0; i--){printf("存储地址:var[%d] = %x\n",i-1,ptr);printf("存储值:var[%d] = %d\n",i-1.*ptr);ptr--;}return 0;
}
- 指针的比较
只要变量指针所指向的地址小于或等于数组的最后一个元素的地址&var[MAX-1],则把变量指针进行递增
#include<stdio.h>int const MAX = 3;
int main()
{int var[]={10,100,200};int i,*ptr;ptr = var;i = 0;while( ptr<=&var[MAX-1] ){printf("Adress of var[%d] = %x\n",i,ptr);printf("value of var[%d] = %d\n",i,*ptr);ptr++;i++;}return 0;
}
-
C指向指针的指针
指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置 -
C传递指针给函数
传递一个无符号的long型指针给函数,并在函数内改变这个值:
#include<stdio.h>
#include<time.h>void getSeconds(unsigned long *ptr)int main()
{unsigned long sec;getSeconds(&sec);printf("Number of seconds:%ld\n",sec);return 0;
}void getSeconds(unsigned long *ptr)
{*ptr=time(NULL); //获取当前的秒数return;
}
能够接收指针作为参数的函数,也能接收数组作为参数
#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); //传递一个指向数组的指针作为参数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函数指针
函数指针是指向函数的指针变量
函数指针可以像一般函数一样,用于调用函数、传递参数
函数指针变量的声明:
typedef int (*fun_ptr)(int,int); //声明一个指向同样参数、返回值的函数指针类型
一下实例声明了函数指针变量p,指向函数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);/* 与直接调用函数等价,d=max(max(a,b),c) */d = p(p(a,b),c);printf("max is:%d\n",d);return 0;
}
- 回调函数
函数指针作为某个函数的参数
函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数
实例中populate_array函数定义了三个参数,其中第三个参数是函数的指针,通过该函数来设置数组的值
实例中定义了回调函数getNextRandomValue,它返回一个随机值,它作为一个函数指针传递给populate_array函数
populate_array将调用10次回调函数,并将回调函数的返回值赋值给数组
#include<stdio.h>
#include<stdlib.h>//回调函数
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;
}