搜索
bottom↓
回复: 11

c语言中,如何实现指向任意数据类型的指针?

[复制链接]

出0入0汤圆

发表于 2013-3-29 09:34:11 | 显示全部楼层 |阅读模式
假如一个指针*p,要指向一堆数据
int a=1;
float b=1.2345;
short c=1234;
long d=1234567;
......................
......................
......................
这堆数据里有int,float,long等任意的数据类型。
要怎么才能让指针指向任意的数据类型呢?

出0入54汤圆

发表于 2013-3-29 09:47:54 | 显示全部楼层
void *p???

出0入0汤圆

发表于 2013-3-29 09:51:36 | 显示全部楼层
楼主,C语言应该系统的学一下,特别是指针部分。C语言的精华就在指针。
指向任意类型的指针类型是void * p,具体使用时再转换为具体的类型。
void * p = &ch;
char * pch = (char *)p;

出0入25汤圆

发表于 2013-3-29 09:51:47 | 显示全部楼层
同楼上 void *p  
p = &a;
使用的时候记得指定类型
printf("%d\n",*(int *)p);        
p = &b;
printf("%f\n",*(float  *)p);

出0入0汤圆

 楼主| 发表于 2013-3-29 10:07:31 | 显示全部楼层
本帖最后由 hack3er 于 2013-3-29 10:09 编辑
mengfc 发表于 2013-3-29 09:51
楼主,C语言应该系统的学一下,特别是指针部分。C语言的精华就在指针。
指向任意类型的指针类型是void * p ...


谢谢,void *这个我知道,但是有时候也不好用。
比如使用的时候数据类型不确定或无规律呢?

假如如下的情况:

void *p1,*p2;
unsigned char i;

unsigned char a1=3;
unsigned char a2=4;

char b1=5;
char b2=6;

unsigned short c1=34567;
short c2=4578;

float d1=5.354;
long d2=64545487;

switch(i)
{
  case 0:
    p1=&a1;
    p2=&a2;
    break;
  case 1:
    p1=&b1;
    p2=&b2;
    break;
  case 2:
    p1=&c1;
    p2=&c2;
    break;
  case 3:
    p1=&d1;
    p2=&d2;
    break;
}
然后每次不同i的情况下使用*p1,*p2
数据的类型都是不一样的,难道每次都手工去指派数据类型么?
假如有N多的变量,但是某一状态下只要用到其中一两个。
每次都要手工去干预数据类型的指派,多费事?
这样的话,还不如直接赋值来的快。
有没有什么办法让不同i的时候知道转成对应的数据类型?

出0入0汤圆

发表于 2013-3-29 10:21:17 | 显示全部楼层
感觉像C++里面的多态机制;
这样用不怕出危险?

出0入0汤圆

 楼主| 发表于 2013-3-29 10:25:04 | 显示全部楼层
jm2011 发表于 2013-3-29 10:21
感觉像C++里面的多态机制;
这样用不怕出危险?

那处理某状态下只用多数据中的某一两个数据(数据类型不一定一样)有什么好的方法?

难道只能取值->缓存->再赋值?

这样很费程序空间的。。

出0入0汤圆

 楼主| 发表于 2013-3-29 10:56:02 | 显示全部楼层
顶起,沉的真快。。。

出0入0汤圆

发表于 2013-3-29 10:59:34 | 显示全部楼层
用union来实现

出0入0汤圆

 楼主| 发表于 2013-3-29 11:06:40 | 显示全部楼层
snower 发表于 2013-3-29 10:59
用union来实现

能详细些?

出0入0汤圆

发表于 2013-3-29 11:16:15 | 显示全部楼层
这样是不安全的用法,不知道数据类型怎么做处理?知道了数据类型就意味着传递的时候已经指明了数据类型,既然已经指明了那这个问题就不存在了.5L提到的问题,在C里面没有办法解决.

出0入0汤圆

发表于 2013-3-29 11:22:08 | 显示全部楼层
union {
  struct {
    unsigned char a1;
    unsigned char a2;
  };
  struct {
    char b1;
    char b2;
  };
  struct {
    unsigned short c1;
    short c2;
  };
  struct {
    float d1;
    long d2;
  };
} data;

data.d1 = 5.354;
data.d2 = 64545487;
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 00:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表