c和c++中,对结构体进行强制类型转换!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c和c++中,对结构体进行强制类型转换!相关的知识,希望对你有一定的参考价值。

有结构体struct A
long long a
int b
;
A* a1 ;a1->b=(int)A ; 高手给个解释,谢谢
是这样的A* a2=new A; a2->b=(int)a2
int b ;
char c;
longlong f
int b 放在结构体最前面 ,能把指针转换成整形b 么?

看到一款数据库语法解析器的代码,其中的词法分析语法解析阶段,利用一个结构体存储所解析的SQL语句的类型,然后根据这个类型将改结构体强制转换为对应的另一结构体并赋值给他,以便做进一步的执行工作.
举个简单的例子:
存储语法解析后数据的结构体(注意,其只有一个元素)为:
struct analyse

int type;
;
我们约定的不同的type代表不同的SQL操作,假如type=1时表示alter table操作,type=2时表示select操作,type等于3时表示create table操作等等.那么我们对不同的操作有不同的结构体来存储信息,例如:
struct alter

int type;
int number;
char subtype;
......
......
;
struct select

int type;
char relnum;
long tablenum;
......
......
;
注意到,结构体analyse,alter与select中第一个元素的类型都是一样的,表示的意思也相同,都是代表不同的操作号.现在若判断analyse中的type为1时,就将其强制转换为struct alter并赋值给struct alter类型的变量;若判断analyse中的type为2时,就将其强制转换为struct select并赋值给struct select类型的变量.
可能有人会问了,为什么程序里要对类型不同的结构体之间强制转换并赋值呢?
问题解析
问题的关键在于,结构体struct analyse中的type存储不同的值时,在紧挨着结构体的内存中按照要强制转换的结构体的元素类型存储了相对应的数据.
例如,当结构体struct analyse中的type为1时,需要在紧挨着结构体struct analyse的高地址区域按照结构体struct alter的数据类型存储对应的数据,包括int,char等等.当结构体struct analyse中的type为2时,需要在紧挨着结构体struct analyse的高地址区域按照结构体struct select的数据类型存储对应的数据,包括char,long等.
这样,在进行强制转换时,结构体struct analyse与结构体struct analyse中除了int type以外的那些元素就可以得到相对应的值了.
简单的小例子
下面是一个简单的小例子,说明了该强制转换的问题:
struct A
int num;
;
struct B
int num;
char type;
int age;
;
int main()

struct A a;
a.num=1;
char* tmp1=(char *)(&(a.num));
tmp1=tmp1+4;
*tmp1='a';
int *tmp2=(int *)(&(a.num));
tmp2=tmp2+2;
*tmp2=100;
struct B *b=(struct B *)(&a);
printf(“ b->num=%d b->type=%c b->age=%d \n”,b->num,b->type,b->age);
参考技术A 指针可以强制转化为整型,相当于地址如0x11111111转化成整型0x11111111。
你的程序是正确的
参考技术B 这只是指针赋值.
也就是把a1这个结构体的指针,赋值给b,因为b不是结构体指针类型,所以要强制转换.
这个b也就是相当于链表中的那个next指针一样,指针都是整型的,但一般都用DWORD来存储,用int也是可以的,反正都是4个字节
参考技术C 以上程序是不正确的,A是一个结构体名,怎会复制给一个int变量呢

在这里a1是个结构体类型的指针变量,其中的值是个地址,如果将它付给a1->b 那么b中的值就是地址,因为a1没有指向某个结构体A型的变量,所以里面的值是个不确定的地址。

如果要实现你说的功能,应该为a1->b=(int)a1->b,不过这是没有意义的。

就算这样也是不行的,必须指明是哪个成员。本回答被提问者采纳

C++结构体如何设置默认值?

几天老师讲了类类型可以通过构造函数对其成员进行初始化。
在结构体中可以吗?
例如
struct node
int flag;;
我想每声明一个node变量,其中的flag值默认为0,该怎么办?
那么在C语言中可不可以对结构体赋默认值呢?

几天老师讲了类类型可以通过构造函数对其成员进行初始化。
在结构体中可以吗?
可以的。

我想每声明一个node变量,其中的flag值默认为0,该怎么办?
像下面这样:
#include <iostream.h>

struct node

int flag;
node(); // 默认构造函数
;
node::node()

flag = 0; // 像这样


int main(int argc, char *argv[])

// 测试
node n;
cout << n.flag << endl;
return 0;
参考技术A 1)默认成员访问权限为struct为public,class为private;
(2)默认继承权限,继承自struct的默认为public继承,继承自class的默认为private继承。
除此之外,class是怎样的,struct就是怎样。

至于只有基本类型成员的POD类型来说,它确实有一些特别的地方,比如可以用大括号的语法来初始化。但这一点class也是一样的,并没有什么实质区别。比如你的:
struct SysMaskPara

int UpPortFirst;
int UpPortSecond;
int UpPortThird;
int UpPortFourth;
;
如果改写成:
class SysMaskPara

public:
int UpPortFirst;
int UpPortSecond;
int UpPortThird;
int UpPortFourth;
;
在C++语言中,效果上是一样的。只不过那样一来,C语言用不了了。
参考技术B c++中的结构体基本上可以和类等同,只是结构体的默认权限是public,而类的则是private,完全可以给结构体写构造函数,但是在c语言中就不可以。 参考技术C 默认值设置为0
sturct node aaa;
直接用memset(&aaa,0,sizeof(node));
参考技术D 可以 结构体除了默认属性私有以外 跟类是一样的

以上是关于c和c++中,对结构体进行强制类型转换!的主要内容,如果未能解决你的问题,请参考以下文章

关于强制类型转换(c语言)

C# 结构体转string 类型

C++中的数据类型强制转换

C++ --- 强制转换运算符

go判断interface类型及类型转换

C++强制类型转换