结构体、联合、枚举与高级指针

什么是结构体

    是一种数据类型

    由程序员自定义的数据类型

    结构体内可以包含不同类型的成员


结构体语法格式

  
  
  1. struct 结构体名{
  2.    成员;
  3. }
  4. typedef struct{
  5.    int age; // 成员
  6.    char name[20];
  7. }结构体名; // 别名


结构体所占内存空间

    字符对齐规则

        找出占存储空间最大的成员

        以其为单位分配存储空间

        每个成员存放在偏移量对该成员所占字节数取余为0处


结构体成员赋值

  
  
  1. int main()
  2. {
  3.    struct{
  4.         int i;
  5.         char ch;
  6.         double d;
  7.     }s;
  8.     s.i = 10;
  9.     s.ch = 'A';
  10.     s.d = 3.14;
  11.     printf("%d, %c, %g\n", s.i, s.ch, s.d);
  12.     return 0;
  13. }

什么是联合

    联合的用法、语法和结构非常相似,但联合中所有成员分配的内存是同一块。(只能保存一个成员信息,联合的空间以最大成员所占的空间为值)

    联合可以用一块内存对应多种数据类型

    联合与结构的区别,结构可以保存多个成员信息,而联合只能保存一个成员信息切最后一个。



联合语法格式

  
  
  1. union 联合名{
  2.    int age;
  3.    char name[2];
  4. }
  5. typedef union{
  6.    int age;
  7.    char name[2];
  8. }联合名;

什么是枚举

    用字面来描述一组有规律的数值。

    枚举的默认值从0开始,每个值都是一个整型常量。

    只能在声明枚举的时候,修改枚举值。


枚举语法格式

  
  
  1. enum 枚举名 {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};
  2. typedef enum{FALSE, TRUE} 枚举名;

高级指针


双指针

什么是双指针(二级指针)

    双指针即二级指针,是指针的指针

  
  
  1. int main()
  2. {
  3.    int x = 10;
  4.    int * px = &x;
  5.    int ** ppx = &px;
  6.    int *** pppx = &ppx;
  7.    int **** ppppx = &pppx;
  8.    return 0;
  9. }

双指针的应用

  
  
  1. void get_message(cbar ** p)
  2. {
  3.    *p = "Hello World!";
  4. }
  5. int main()
  6. {
  7.    char * msg = NULL;
  8.    get_message(&msg);
  9.    printf("msg:%s\n", msg);
  10.    return 0;
  11. }

用参数返回字符串

    定义一个函数,该函数的参数是一个指针的指针,用以返回函数体内的字符串。



void指针


什么是void的指针

    代表任意类型的指针

    malloc分配堆内存时,由于无法确定内存存储类型,所以可以谁用void*代表任意指针类型。


void指针的应用

    不能直接对void*指针进行*操作,可以进行类型转换,然后在进行*操作。

    void*能进行加减操作,但以1字节为单位进行运算,所以说想向void进行加、减操作,最好先别转换数据类型。



函数指针

什么是函数指针

    函数指针是指向函数的指针变量

    每个函数都有一个入口地址

    指针变量中保存函数的入口地址

    函数指针的用途(调用函数,做函数的参数)


函数指针的语法格式

  
  
  1. void fa()
  2. {
  3.    printf("in function fa\n");
  4. }
  5. int main()
  6. {
  7.    printf("&fa = %p\n", &fa);
  8.    void(*pfa)(); // pfa是变量,函数指针变量,保存函数的地址
  9.    pfa = &fa;
  10.    (*pfa)();
  11.    return 0;
  12. }

函数指针的应用

  
  
  1. void fa()
  2. {
  3.    printf(in function fa\n"");
  4. }
  5. void invoke(void(*f)())
  6. {
  7.    printf("调用传进来的函数\n");
  8.    (*f)(); // 调用传入的函数
  9. }
  10. int main()
  11. {
  12.    invoke(&fa);
  13.    return 0;
  14. }

函数指针的优缺点

    优点是对于通用函数中要涉用到另一个函数,但函数名称未定,是让用户编的,此时需要使用函数指针。

    缺点是由于函数指针指向的函数未定,容易导致程序崩溃











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值