|
发表于 2018-10-12 17:13:35
|
显示全部楼层
本帖最后由 风扫地 于 2018-10-12 17:44 编辑
不知道你到底要干啥,尝试写写吧。
不同意楼上说的指针变量不是变量,指针变量也是变量,是特殊一点的变量,也有空间存储指针变量的值,也可以对这些值或它的存储地址做一些有意思的操作,你要愿意,一个常数都能强转为(函数)指针赋值给指针变量,然后通过这个指针变量访问特定内存或调用特定代码段。
下面程序申请了八个字节的"共用体",干啥都行~
- int i = 0;
- char space[8] = {0,}; // 申请8字节的栈空间
- void* p = space;
- for(i = 0;i<8;i++)
- {
- ((char*)p)[i] = 0x30+i;
- printf("%c\n", ((char*)p)[i]);
- }
- for(i = 0; i < 4;i++)
- {
- ((short int*)p)[i] = 100+i;
- printf("%d\n", ((short int*)p)[i]);
- }
- for(i = 0; i < 2;i++)
- {
- ((long int*)p)[i] = 12345+i;
- printf("%d\n", ((long int*)p)[i]);
- }
- for(i = 0; i < 2;i++)
- {
- ((float*)p)[i] = 123.35 + i*i;
- printf("%f\n", ((float*)p)[i]);
- }
- for(i = 0; i < 1;i++)
- {
- ((double*)p)[i] = 123456.789456;
- printf("%f\n", ((double*)p)[i]);
- }
复制代码
以上代码请勿在内存未统一编码的编译环境或CPU上使用(如单片机,某些arm芯片)下使用;因为我默认了你运行的环境中所有类型的指针长度都是4字节(32位系统,4个字节所能存储的数据范文已经能覆盖所有的内存空间了),char 1字节 ,short int 2字节,long int 4字节 ,float 4字节 double 8字节,且CPU是小端的。
1.其实内存你申请下来了,在遵守访问规则的情况下,想怎么用就怎么用,不然malloc函数为什么返回值是void*型的了?就是让你自己确定那些空间的用途,如果空间很省很省,位域级别的空间都能省出来,共用体能一个bit一个bit给你管理内存;
2.共用体发明出来有它特定的需求背景和应用场合,有节省空间的效果(不然你看看TI的dsp库里面对功能寄存器的定义为啥都是用的共用体,而且还是位域级别的共用体),如果共用体能解决问题就直接用共用体吧,你自己写的自己认为的NB代码别人看不懂咋办?
3.你说的共用体会浪费空间谋求新的方法,应该举出具体例子来分析并寻求具体的方案,一概而论的话,做应用层的程序员会很累,毕竟内存管理和调度是开发编译器和开发操作系统的人的事。
|
|