联合 枚举 双指针 万能指针void*

1.联合

1.1 联合是程序员自己创建的一种数据类型

typedef union U{                   //联合中的所有成员变量共用一块存储空间

    int x;
    int y;
    int z;
};
...
        U u1;
        NSLog(@"%lu",sizeof(u1));
        u1.x=10;
        NSLog(@"%d,%d,%d ",u1.x,u1.y,u1.z);    //(输出结果:101010)其他两个也会为10
...       
typedef union {
    char ch[4];
    int x;               
}Data;
...
Data d;              
        d.x=0x41424344;            //每两个16进制数占4个字节,按小端存储 。
        for(int i=0;i<4;i++){
            printf("%c ",d.ch[i]);            //ASCLL码,   输出结果(D C B A)
        } 
        printf("\n");    
...

2.枚举

2.1 也是程序员自己创建的一种数据类型

typedef enum{
    MONDYA=100,TUESDAY,WEDNESDAY,THURDAY=200,FRIDAY,SATURDAY,SUNDAY,
}Weed;           //常量必须为整数,可以指定值,不指定的值按前边指定的值依次+1;

void show(Weed type){
    switch (type) {
        case MONDYA: //增加代码可读性
            NSLog(@"星期一");
            break;
        case TUESDAY:
            NSLog(@"星期二");
            break;
        case WEDNESDAY:
            NSLog(@"星期三");
            break;
        case THURDAY:
            NSLog(@"星期四");
            break;
        case FRIDAY:
            NSLog(@"星期五");
            break;
        case SATURDAY:
            NSLog(@"星期六");
            break;
        case SUNDAY:
            NSLog(@"星期日");
            break;
    }

int main()
{
    @autoreleasepool {

        NSLog(@"%d",MONDYA); /
        NSLog(@"%d",TUESDAY);      
        NSLog(@"%d",SUNDAY);      // 输出结果(100  101   203)
        show(MONDYA);                     //输出结果   (星期一)
    }
    return 0;
}

3.双指针

3.1 指针的指针
3.2 值传递的本质是在函数体内修改形参本身
3.3地址传递的本质是在函数中修改形参指向的变量

void get(char** str)
{
    *str ="abcd";
}
  int main()
{
    @autoreleasepool {
        int x=10;
        int* px=&x;
        int** ppx=&px;
        **ppx=20;
        NSLog(@"%d",x);     //输出结果(20)
        char *msg=nil;
        get(&msg);
        printf("%s\n",msg);    //输出结果(abcd)
    }
    return 0;
}

4.万能指针void*

4.1 万能指针,可以指向任意类型的变量,
4.2 在使用时,需先将其转换回指向的变量的类型

int main()
{
    @autoreleasepool {
        int x=10;
        int *px=&x; //同一类型的指针只能指向同一类型的变量
        NSLog(@"%d",*px);
        double *pd=&x; //不用类型的指针,不能指向不同的类型的变量
        NSLog(@"%lg",*pd); //输出垃圾值
        void *p=&x;        //定义万能指针
        double d=3.14;
        p=&d; //void* 类型的指针可以指向任意类型的变量
        NSLog(@"%lg",*(double *)p); //万能指针在引用其指向的变量时,需先将其转换回指向的变量的类型
    }
    return 0;
}
 //编写一个函数,用万能指针做形参,打印任意类型的变量值
typedef enum{
    INT,FLOAT,DOUBLE,CHAR,
}Type;


void print(void *p,Type type){
    switch (type) {
        case INT:
            NSLog(@"%d",*(int*)p);
            break;
        case FLOAT:
            NSLog(@"%g",*(float*)p);
            break;
        case DOUBLE:
            NSLog(@"%lg",*(double*)p);
            break;
        case CHAR:
            NSLog(@"%c",*(char*)p);
            break;
    } 
}

int main()
{
    @autoreleasepool {
        int a=10;
        char b='a';
        float c=3.14;
        print(&a,INT);
        print(&c, FLOAT);
        print(&b,CHAR);

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值