结构体和预定义

本文介绍了C语言中的类型重定义typedef,如何使用它为复杂类型创建别名。接着详细讲解了结构体的定义、占用空间的规则以及通过指针访问结构体成员的方法。此外,还探讨了预处理的概念,包括头文件包含、宏替换和条件包含等基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、类型重定义:typedef 为一个复杂的类型起一个别名;
例: typedef unsigned long size_t; //size_t就是ensign long类型
引用:C++ 中给变量起一个别名
int a = 10;
int &aa = a;
2、结构体的定义:
struct:是一种数据结构,用于表示有关联的元素的集合;
struct people
{
char *name;
int age;
char *sex;
}; //分号不可少
数组:相同类型的集合
3、定义方式:
1)只定义结构体

        struct people       
        {
            char *name;
            int age;
            char *sex;
        };
    struct people peop = {“lily”,22,”girl”};    
    struct people peop = {“lily”,22};//可以缺省赋值,sex默认为NULL
    struct people peop = {“lily”,”girl”};   //error 不能跳跃缺省赋值
    //访问/修改:
                 peop.name = "jhon";
                 printf("姓名为:%s\n",peop.name);
2)定义结构体的同时声明结构体变量
        struct people       
        {
            char *name;
            int age;
            char *sex;
        }peop;  
//赋值访问方式:定义后不能直接初始化,与数组相同
     sample .name = "lily1";
     sample.age = 22;
     sample.sex = "girl";
     printf("姓名为:%s\n",sample.name);
3)类型重定义
    typedef struct people
    {
           char *name;
            int age;
            char *sex;
    }sample;    //sample是struct people的别名
//定义访问方式    
     sample peop = {"lily",22,"girl"};     等价于  struct people peop = {“lily”,22,”girl”};    
         peop.name = "jhon";
     printf("姓名为:%s\n",peop.name);

4、结构体占用空间大小:
结构体有所占空间自动补齐功能:不同类型向内存占用最大的看齐,相邻的两个元素可以结合补齐,但是不能隔着元素
例:

    int a;
    char b;     //占8字节,char 类型补3个字节
char a;
    char b;     //占2字节
    double a;
    int b;
    char c;     //占16字节,最长下方累加补齐
    int a;
    double b;
    char c;     //占24字节,最长上下各自补齐(不允许跨过
//最长占用内存变量累加)
     struct people
    {
          double id;
           int age;

    };
    struct num
    {
            struct people p;
            char sex;
    };          //占24字节,不同结构体之间不会累加补齐

5、结构体指针访问成员方式:(*变量名).成员名 / 变量名->成员名
struct people
{
double id;
int age;

};
 struct people peop = {001,22};
 struct people *pt = &peop;
 printf("&ld",pt->id);       //指针访问
 printf("%d",(*pt).age);     //指针解引用之后进行访问

预处理
1、种类:
1)头文件包含
2)宏替换
3)条件包含
2、头文件包含:在一个文件中包涵另一个头文件(.h)的内容,在编译处理时将另一个头文件的内容复制到#include命令所在到位置
使用尖括号#include

    带参宏替换:#define 宏名(参数列表)  字符串
例:  #define  max(a,b) ( (a) > (b) ? (a) : (b) )
注意:带参宏替换要注意参数的变换,防止副作用,例如:(*p++)>(a)?(*p++):(b)这个式子指针p会自增两次

4、条件包含:#if #elif #else #endif / #ifdef #endif / #ifndef #endif
防止预定义重复

*#ifndef Person_hpp
*#define Person_hpp*
*#include <stdio.h>*
*#endif /* Person_hpp */**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值