C与C++中指针类型转换

问题来源:在学习共享内存时,其中有一个指针类型的强制转换

stu *p;

p=shmat(); 

其中stu是自定义结构,shmat()的返回类型是void*

        指针占据一个4个字节的地址空间(由于程序的寻址空间是2^32次方,即4GB,所以用4个字节表示指针就已经能指向任何程序能够寻址到的空间了,所以指针的大小为4字节)。我们可以将指针强制转换成int型或者其他类型。同样,我们也可以将任何一个常数转换成int型再赋值给指针。所有的指针所占的空间大小都是4字节,他们只是声明的类型不同,他们的值都是地址指向某个东西,他们对于机器来说没有本质差别,他们之间可以进行强制类型转换。

指针 to 指针的强制类型转换是指将指针所指的内容的类型由原先的类型转换为后面的类型:即进行变量解释的时候,解释的类型变化

void指针又名万能指针,在现在的很多程序中,当参数不确定时就用万能指针代替,这一类的指针在线程\进程函数里特别常见。

C与C++中指针类型转换_第1张图片

1、指针类型强制转换:

int m;

int *pm = &m;

char *cp = (char *)&m;

pm指向一个整型,cp指向整型数的第一个字节


2、结构体之间的强制转换

struct str1 a;

struct str2 b;

a=(struct str1) b;                  //this is wrong

a=*((struct str1*)&b);         //this is correct


但C++中感觉不安全,不支持指针类型的转换了,

C++中对类型要求很高,不允许不同类型指针之间的相互赋值,void指针例外(任何类型指针都可以赋值给void指针) 如果要赋值必须显示转换

小心使用void指针:不能对void指针进行算法操作

解决1: 

 void *q;

        stu* p;
       q=shmat(shmid,NULL,0);
       if(q==(void*)-1) ERR_EXIT("shnat");

p=(stu *)q;

解决2: 赋值时就直接将stu*赋值给c=void*

stu* p;
     p=(stu*)shmat(shmid,NULL,0);

    if(p==(stu* )-1) ERR_EXIT("shnat");


所以对于这种还是不呀用了,通过了也很诡异

引进了4新的类型转换操作符:

static_cast:最常用的类型转换符,在正常状况下的类型转换,如把int转换为float

const_cast:用于取出const属性,把const类型的指针变为非const类型的指针

dynamic_cast:该操作符用于运行时检查该转换是否类型安全,但只在多态类型时合法,即该类至少具有一个虚拟方法。dynamic_cast与static_cast具有相同的基本语法,dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

reinterpret_cast:interpret是解释的意思,reinterpret即为重新解释,此标识符的意思即为数据的二进制形式重新解释,但是不改变其值。


部分转载


你可能感兴趣的:(C++语言基础)