union的妙用

逍遥云 posted @ 2011年1月11日 06:12 in c/c++ with tags c c++ struct union , 9912 阅读

先前看了SDL的SDL_Event, 不大明白其中的用法,后来翻了翻书中关于union的用法,再则看到了云风的这篇文章C 语言中统一的函数指针, 就写了一个不成文的例子, 把union作为函数的参数传递, 可以将两个毫不相干的不同类型的结构数据粘合在一起, 的确很有意思.


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

typedef enum bool {false, true} bool;

typedef struct Number {
    unsigned char type;
    unsigned int num;
    bool sign;
} Number;

typedef struct OP {
    unsigned char type;
    char ch;
} OP;

typedef union Button {
    unsigned char type;
    Number num;
    OP op;
} Button;

void printNum(int num)
{
    printf("Print Number:%d\n", num);
}

void printOP(char op)
{
    printf("Print Op:%c\n", op);
}

void cal(Button p)
{
    switch(p.type)
    {
        case 1:
            printNum(p.num.num * ((p.num.sign) ? 1 : -1));
            break;
        case 2:
            printOP(p.op.ch);
            break;
    }
}


int main()
{
    Button p1;
    p1.num = (Number) {1, 9, false};
    cal(p1);

    p1.op = (OP) {2, '='};
    cal(p1);

    exit(0);
}

这里要注意结构体的第一个字段一定要与union的第一个字符对应起来, 至于为什么, 去翻看union用法吧...

 

Avatar_small
ownwaterloo 说:
2011年1月11日 22:09

云风又犯傻了……
C语言本来就有"统一的函数指针", 任何一种函数指针都是。

Avatar_small
翻墙砖家 说:
2011年1月16日 03:14

@ownwaterloo: 为什么要说“又”呢。。。。cool

Avatar_small
ownwaterloo 说:
2011年1月16日 07:21

@翻墙砖家:
因为他"经常"啊。
说个最出名的吧, 在《游戏之旅》中,6.2.2 低效的静态变量 141页

同样的道理,临时构造一个对象,
使用系统提供的new操作间接地调用了malloc是一种低效的操作;
注重效率的做法是一个placement new,
而改用alloca在堆栈中分配对象需要的空间,
然后在退出函数时直接调用对象的析构函数,
而不是delete方法,
让函数退出时的堆栈调整操作自动回收内存。

才看到这段时, 我自己都被忽悠了。
回过头再看才发现犯二了……

Avatar_small
sunus 说:
2011年3月22日 01:36

^^这blog挺有意思
mark一下..
这里不能加好友啊 可惜了><

Avatar_small
seo service london 说:
2023年12月13日 13:53

I found this is an informative and interesting post so i think so it is very useful and knowledgeable. I would like to thank you for the efforts you have made in writing this article.

Avatar_small
토토커뮤니티 说:
2024年1月21日 14:23

Interesting post. I Have Been wondering about this issue. so thanks for posting. Pretty cool post.It 's really very nice and Useful post.Thanks

Avatar_small
토토커뮤니티 说:
2024年1月21日 14:24

I think about it is most required for making more on this get engaged

Avatar_small
슬롯사이트 说:
2024年1月21日 16:50

I need to seek destinations with important data on given point and give them to educator our feeling and the articl

Avatar_small
카지노사이트 说:
2024年1月21日 17:43

This article is an appealing wealth of informative data that is interesting and well-written

Avatar_small
머니맨 说:
2024年1月21日 18:12

Someone Sometimes with visits your blog regularly and recommended it in my experience to read as well. The way of writing is excellent and also the content is top-notch. Thanks for that insight you provide the readers

Avatar_small
카지노 보증 说:
2024年1月21日 18:32

This is a great article thanks for sharing this informative information. I will visit your blog regularly for some latest post. I will visit your blog regularly for Some latest post

Avatar_small
카지노뱅크 说:
2024年1月21日 19:22

This article is an appealing wealth of informative data that is interesting and well-written

Avatar_small
토토커뮤니티 说:
2024年1月21日 20:02

Like your cool blog, I'll try hard

Avatar_small
카지노사이트추천 说:
2024年1月21日 21:06

I have read your article; it is very informative and helpful for me. I admire the valuable information you offer in your articles. Thanks for posting it

Avatar_small
industrial outdoor s 说:
2024年1月22日 13:47

All your hard work is much appreciated. Nobody can stop to admire you. Lots of appreciation

Avatar_small
온라인카지노 说:
2024年1月22日 14:29

I just found this blog and have high hopes for it to continue. Keep up the great work, its hard to find good ones. I have added to my favorites. Thank You

Avatar_small
소액결제현금화 说:
2024年1月22日 14:58

I haven’t any word to appreciate this post.....Really i am impressed from this post....the person who create this post it was a great human..thanks for shared this with us

Avatar_small
스포츠중계 说:
2024年1月22日 15:32

That appears to be excellent however i am still not too sure that I like it. At any rate will look far more into it and decide personally

Avatar_small
카지노커뮤니티 说:
2024年1月22日 16:12

Cool you write, the information is very good and interesting, I'll give you a link to my site

Avatar_small
토토사이트 说:
2024年1月24日 16:28

It’s hard to find knowledgeable people on this topic however you sound like you know what you’re talking about! Thanks 

Avatar_small
슬롯사이트 说:
2024年1月24日 18:08

Thanks so much for this information. I have to let you know I concur on several of the points you make here and others may require some further review, but I can see your viewpoint

Avatar_small
바카라사이트 说:
2024年1月26日 16:08

바카라사이트 바카라사이트 우리카지노 카지노는 바카라, 블랙잭, 룰렛 및 슬롯 등 다양한 게임을 즐기실 수 있는 공간입니다. 게임에서 승리하면 큰 환호와 함께 많은 당첨금을 받을 수 있고, 패배하면 아쉬움과 실망을 느끼게 됩니다.

Avatar_small
하노이 밤문화 说:
2024年1月26日 16:24

하노이 꼭 가봐야 할 베스트 업소 추천 안내 및 예약, 하노이 밤문화 에 대해서 정리해 드립니다. 하노이 가라오케, 하노이 마사지, 하노이 풍선바, 하노이 밤문화를 제대로 즐기시기 바랍니다. 하노이 밤문화 베스트 업소 요약 베스트 업소 추천 및 정리.

Avatar_small
먹튀검증 说:
2024年1月29日 15:27

No.1 먹튀검증 사이트, 먹튀사이트, 검증사이트, 토토사이트, 안전사이트, 메이저사이트, 안전놀이터 정보를 제공하고 있습니다. 먹튀해방으로 여러분들의 자산을 지켜 드리겠습니다. 먹튀검증 전문 커뮤니티 먹튀클린만 믿으세요!!

Avatar_small
베트남 유흥 说:
2024年1月29日 15:41

베트남 남성전용 커뮤니티❣️ 베트남 하이에나 에서 베트남 밤문화를 추천하여 드립니다. 베트남 가라오케, 베트남 VIP마사지, 베트남 이발관, 베트남 황제투어 남자라면 꼭 한번은 경험 해 봐야할 화끈한 밤문화로 모시겠습니다.

Avatar_small
투게더벳 说:
2024年1月31日 19:23

이 게시물에 많은 정보가 포함되어있어 매우 유용하다는 것을 알게되어 기쁩니다. 나는 항상 양질의 콘텐츠를 읽는 것을 선호하며 당신이 게시물에서 찾은 것을 읽었습니다. 공유 해주셔서 감사합니다

Avatar_small
볼트카지노가입코드 说:
2024年1月31日 19:44

이 게시물에 많은 정보가 포함되어있어 매우 유용하다는 것을 알게되어 기쁩니다. 나는 항상 양질의 콘텐츠를 읽는 것을 선호하며 당신이 게시물에서 찾은 것을 읽었습니다. 공유 해주셔서 감사합니다

Avatar_small
달팽이주소 说:
2024年1月31日 20:02

이 게시물에 많은 정보가 포함되어있어 매우 유용하다는 것을 알게되어 기쁩니다. 나는 항상 양질의 콘텐츠를 읽는 것을 선호하며 당신이 게시물에서 찾은 것을 읽었습니다. 공유 해주셔서 감사합니다

Avatar_small
쇼미더벳먹튀 说:
2024年1月31日 20:15

그것은 훌륭한 사고 방식입니다. 그럼에도 불구하고 그 수학에 대해 설교하는 것이 무엇이든간에 모든 문장을 만드는 데 도움이되는 것은 아닙니다. 사실상 어떤 방법 으로든 본인의 글을 델리 시우스로 홍보하기 위해 노력한 것 외에도 많은 노력을 기울 였음에도 불구하고 귀하의 정보 사이트를 사용하는 것이 딜레마 인 것 같습니다. 아이디어를 다시 확인해 주시면 감사하겠습니다. 다시 한 번 감사합니다

Avatar_small
카림벳먹튀 说:
2024年1月31日 20:36

그것은 훌륭한 사고 방식입니다. 그럼에도 불구하고 그 수학에 대해 설교하는 것이 무엇이든간에 모든 문장을 만드는 데 도움이되는 것은 아닙니다. 사실상 어떤 방법 으로든 본인의 글을 델리 시우스로 홍보하기 위해 노력한 것 외에도 많은 노력을 기울 였음에도 불구하고 귀하의 정보 사이트를 사용하는 것이 딜레마 인 것 같습니다. 아이디어를 다시 확인해 주시면 감사하겠습니다. 다시 한 번 감사합니다

Avatar_small
온라인카지노 说:
2024年1月31日 20:57

나는 그것의 모든 작은 부분을 확실히 즐기고 있으며 당신이 게시하는 새로운 내용을 확인하기 위해 북마크했습니다.

Avatar_small
강남벳토토 说:
2024年1月31日 21:09

나는 그것의 모든 작은 부분을 확실히 즐기고 있으며 당신이 게시하는 새로운 내용을 확인하기 위해 북마크했습니다.

Avatar_small
꽁머니카지노 说:
2024年1月31日 21:23

이 게시물에 많은 정보가 포함되어있어 매우 유용하다는 것을 알게되어 기쁩니다. 나는 항상 양질의 콘텐츠를 읽는 것을 선호하며 당신이 게시물에서 찾은 것을 읽었습니다. 공유 해주셔서 감사합니다

Avatar_small
에이전트도메인 说:
2024年1月31日 21:35

이 게시물에 많은 정보가 포함되어있어 매우 유용하다는 것을 알게되어 기쁩니다. 나는 항상 양질의 콘텐츠를 읽는 것을 선호하며 당신이 게시물에서 찾은 것을 읽었습니다. 공유 해주셔서 감사합니다

Avatar_small
Coin exchange 说:
2024年6月03日 17:58

The tech-original mission is to help you better understand technology, and make better decisions in the fields of IT, Tech, and Crypto.
https://www.tech-original.com/

Avatar_small
Coin exchange 说:
2024年6月08日 12:25

The tech-original mission is to help you better understand technology, and make better decisions in the fields of IT, Tech, and Crypto.
https://www.tech-original.com/


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter