一种类型的指针可以随便转换成另一种指针吗?

wode201301 2013-01-23 02:55:05
先上代码,二楼描述问题

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

struct shape;

struct shape_ops

{

/*返回几何体的面积*/

float (*so_area)(struct shape*);

/*返回几何体的周长*/

int (*so_perimeter)(struct shape*);

};

struct shape

{

int* s_type;
char* s_name;

struct shape_ops* s_ops; /*虚接口,所有子类必须实现*/

};



float shape_area(struct shape* s) /*求形状面积*/

{

return s->s_ops->so_area(s);

}

int shape_perimeter(struct shape* s) /*求周长*/

{

return s->s_ops->so_perimeter(s);

}

/*三角形*/
struct triangle

{

struct shape t_base;

int t_side_a;

int t_side_b;

int t_side_c;

};



float triangle_area(struct shape* s) /*三角形面积,用海伦公式*/

{

struct triangle* t=(struct triangle*)s;

int a=t->t_side_a;

int b=t->t_side_b;

int c=t->t_side_c;

float p=(a+b+c)/2;

return sqrt(p*(p-a)*(p-b)*(p-c));

}

int triangle_perimeter(struct shape* s) /*三角形周长*/

{

struct triangle* t=(struct triangle*)s;

int a=t->t_side_a;

int b=t->t_side_b;

int c=t->t_side_c;

return a+b+c;

}

struct shape_ops triangle_ops= /*对父类虚接口的实现*/

{

triangle_area,

triangle_perimeter,

};

struct triangle* triangle_create(int a,int b,int c) /*创建三角形*/

{

struct triangle* ret=(struct triangle*)malloc(sizeof (*ret));

ret->t_base.s_name="triangle";

ret->t_base.s_ops=&triangle_ops;

ret->t_side_a=a;

ret->t_side_b=b;

ret->t_side_c=c;

return ret;

}

/*矩形*/
struct rectangle

{

struct shape r_base;

int r_width;

int r_height;

};



float rectangle_area(struct shape* s) /*矩形面积*/

{

struct rectangle* r=(struct rectangle*)s;

return r->r_width*r->r_height;

}

int rectangle_perimeter(struct shape* s)/*矩形周长*/

{

struct rectangle* r=(struct rectangle*)s;

return (r->r_width+r->r_height)*2;

}

struct shape_ops rectangle_ops= /*对父类虚接口的实现*/

{

rectangle_area,

rectangle_perimeter,

};



struct rectangle* rectangle_create(int width, int height) /*创建矩形*/

{

struct rectangle* ret=(struct rectangle*)malloc(sizeof(*ret));

ret->r_base.s_name="rectangle";

ret->r_base.s_ops=&rectangle_ops;

ret->r_height=height;

ret->r_width=width;

return ret;

}

int main()

{

struct shape* s[4];

s[0]=(struct shape*)triangle_create(5,5,4);

s[1]=(struct shape*)triangle_create(3,4,5);

s[2]=(struct shape*)rectangle_create(10,12);

s[3]=(struct shape*)rectangle_create(5,8);



int i=0;

for(i=0;i<4;i++)

{

float area=shape_area(s[i]);

int perimeter=shape_perimeter(s[i]);

char* name=s[i]->s_name;


printf("name:%s ,area:%.2f ,perimeter:%d\n",name,area,perimeter);

}

return 0;

}
...全文
246 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhcosin 2013-01-24
  • 打赏
  • 举报
回复
对于32位系统而言,指针就是一个用四字节整数表示的地址,指针的类型就是你怎么解释这个地址,无论你怎么转换,这个地址都不会变,要变的是编译器认为这是一个结构体的地址呢,还是一个字符串的地址,如果本来是一个字符串的地址,你把它转成一个结构体的地址,语法没问题,编译没问题,但在运行时会出大问题,比如这个字符串本来只有三个有效字符,第四个字节就是空字符'\0',你现在把它转成一个结构体的地址,假定结构体中的第七个成员是从结构体第七个字节开始的,那么你通过这个指针去引用这个成员的时候,就在读取从这个地址开始的偏移七个字节的地址,鬼知道这个字节是什么东西,可能是一段函数的代码的一部分,也可能压根不是本程序所使用的内存空间,这就是可怕的未定义行为!
ForestDB 2013-01-24
  • 打赏
  • 举报
回复
在C中,所有的东西都可以想办法转的。 但是,逻辑意义自己保证。
taodm 2013-01-23
  • 打赏
  • 举报
回复
从C语言标准来说,指针只能确保可以转为void *,不确保可以互转。 虽然从实践上,只要你的系统下互转的指针都有相同的字节大小就可以的。
AnYidan 2013-01-23
  • 打赏
  • 举报
回复
指针可以随便转换类型的
BrightPi 2013-01-23
  • 打赏
  • 举报
回复
可以,但是要在自己可控的范围内来操作之。
wode201301 2013-01-23
  • 打赏
  • 举报
回复
引用 4 楼 KuaiPengFei_ 的回复:
指针可以随便转换类型的、、(int *)p 强制转换, 问题是很容易出错的!
嗯。不过像一楼中的代码,为了实现面向对象思想,是不是非得转换不可?
Joseph_ 2013-01-23
  • 打赏
  • 举报
回复
指针可以随便转换类型的、、(int *)p 强制转换, 问题是很容易出错的!
wode201301 2013-01-23
  • 打赏
  • 举报
回复
引用 2 楼 tianweishuiguo 的回复:
指针有隐式转换? 这个倒没听过 不过指针是可以随便强制转换的,如果都是四个字节的话,但是你要保证不会用出错
嗯,原来没有强制转换的,都有警告。但是运行没有问题。
东大坡居士 2013-01-23
  • 打赏
  • 举报
回复
指针有隐式转换? 这个倒没听过 不过指针是可以随便强制转换的,如果都是四个字节的话,但是你要保证不会用出错
wode201301 2013-01-23
  • 打赏
  • 举报
回复
声明:一楼的代码来自于: http://blog.chinaunix.net/uid-26921272-id-3360269.html 问题: 第71行:struct triangle* t=(struct triangle*)s; (struct shape*)强制转换为=(struct triangle*) 第202行:s[0]=(struct shape*)triangle_create(5,5,4); 原本是:s[0]=triangle_create(5,5,4); triangle_create(5,5,4)的返回值类型本是(struct triangle*) 被隐式转为:(struct shape*) 请问:不同类型结构体指针之间的转换什么时候隐式,什么时候显式?

70,019

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧