linux c结构体、联合、枚举

原文地址http://daileinote.com/computer/c_base/07

结构体可以用来表示复杂的数据结构,提高表示数据的能力,让你能创造新的形式。

//定义结构体
struct person {
    char name[10];
    int age;
};

//定义结构体变量
struct person p1;

//访问赋值
strcpy(p1.name, 'freecls');
p1.age = 27;

//定义结构体指针
struct person * p2;
p2 = &p1;

//用指针访问赋值
strcpy(p2->name,'freecls_2');
p2->age = 2;

 

重点:

1.结构体可以按值传递给函数,也可以从函数内返回,结构体可以赋值给另一个结构体,如果只是想改变结构体,建议按指针传递(速度快,无额外内存拷贝)

例子

typedef struct person {
    char name[10];
    int age;
} P;

struct person set_age_1(struct person p, int age);
void set_age_2(struct person * p, int age);

void main()
{
    struct person p1,p2;
    strcpy(p1.name, "freecls");
    strcpy(p2.name, "baidu");
    p1 = set_age_1(p1, 27);
    set_age_2(&p2, 22);
    
    printf("%s %d\n", p1.name, p1.age);
    printf("%s %d\n", p2.name, p2.age);
    
    //另一种声明
    P p3 = {"sina", 23};
    printf("%s %d\n", p3.name, p3.age);
    
    //进阶用法
    P *p4 = malloc(sizeof(P));
    p4->age = 24;
    strcpy(p4->name, "csdn");
    printf("%s %d\n", p4->name, p4->age);
    
}

//按值传递并返回结构体多了2次内存复制
struct person set_age_1(struct person p, int age){
    p.age = age;
    
    return p;
}


void set_age_2(struct person *p, int age){
    p->age = age;
}

 

联合是种数据类型,它能在内存中存储不同的数据类型,在例子中讲解

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef union hold{
    int i;
    double d;
    char l;
} u_h;

void main()
{
    //4 8 1
    printf("%d %d %d\n", sizeof(int),sizeof(double), sizeof(char));
    
    //由于这个union中double占用8个字节且是该联合中最大的数据类型
    //所以每次声明变量时不管你存的是int型还是char,都占用8字节
    u_h u1;
    u1.i = 22;      //存入int型22
    u1.d = 3.33;    //删除上面的22,改成3.33double型
    u1.l = 'a';     //删除上面的3.33,改成存'a'
    printf("%c\n", u1.l);
    
    char *tmp = (char *)&u1;
    printf("%c\n", tmp[0]);
    
}
/*
4 8 1
a
a
*/

 

枚举声明符号名称来表示整形常量关键字enum,枚举内部表示的是int型常量。虽然枚举符如one,two是int型,但是枚举变量可以是任意整数型,比如一个枚举的返回是0-2,所以编译器可以用unsigned char来表示。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//0 1 2
enum days {zero,one,two};

//4 5 6
enum color {red=4,green,blue};

void main()
{
    printf("%d\n", green);
    
    //因为two是整形常量,所以可以这样写
    int arr[two] = {1,2};
    printf("%d %d\n", arr[0], arr[1]);
    
    //c1为枚举变量
    enum days c1 = one;
    printf("%d %d\n", c1, sizeof(c1));
    
}
/*
5
1 2
1 4
*/

原文地址http://daileinote.com/computer/c_base/07

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值