首页 > 编程知识 正文

强制类型转换写法,数据类型转换函数

时间:2023-05-05 05:10:47 阅读:250811 作者:4383

const void* pConstVoid;
1)首先用const_cast转换将const void*的const属性去掉
      void* pChar = const_cast<void*>(pConstVoid);
2)用static_cast给void* 变量加上const属性,并转换成char*
      const char* p = static_cast<const char*>(pChar);

void的含义

void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。

void指针使用规范

①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值。例如:

int *pint;

void *pvoid;

pvoid = pint; /* 不过不能 pint = pvoid; */

如果要将pvoid赋给其他类型指针,则需要强制类型转换如:pint = (int *)pvoid;

②在ANSI C标准中,不允许对void指针进行算术运算如pvoid++或pvoid+=1等,而在GNU中则允许,因为在缺省情况下,GNU认为void *与char *一样。sizeof( *pvoid )== sizeof( char ).

void的作用

①对函数返回的限定。

②对函数参数的限定。

当函数不需要返回值时,必须使用void限定。例如: void func(int, int);

当函数不允许接受参数时,必须使用void限定。例如: int func(void)。

由于void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值,因此还可以用void指针来作为函数形参,这样函数就可以接受任意数据类型的指针作为参数。例如:

void * memcpy( void *dest, const void *src, size_t len );

void * memset( void * buffer, int c, size_t num );

指向void 的指针

一个指向任何对象 类型的指针都可以赋值给类型为void* 的变量,void* 可以赋值给另一个void* ,两个void* 可以比较相等与否,而且可以显式地将void* 转换到另一个类型。其它操作都是不安全的,因为编译器并不知道实际被指的是哪种对象。因此,对void* 做其他任何操作都将引起编译错误。要使用void*,就必须显式地将经转换到某个指向特定类型的指针。

例:

void Test(int *pi)

{

void *pv = pi; //ok ,从 int* 到 void* 的隐式转换

*pv ; //错误:void* 不能间接引用

pv++; //错误:void* 不能增量(不知道被指定类型的大小)

int *pi1 = static_cast<int*>(pv); //ok: 显式转换回 int*

double * pi2 = pv; //错误

double *pi3 = pi; //错误

double *pi4 = static_cast<double*>(pv); //ok: 不安全

}

1.一般来说,如果一个指针被转换(“强制”,cast)到与被批对象的实际类型不同的指针,使用后一个指针就是不安全的。 void* 的最重要用途是需要向函数货传递一个指针,而又不能对对象的类型做任凭假设。还有就是从函数返回一个无类型的对象。要使用这样的对象。必须通过显式的类型转换。

2,到函数的指针与到成员的指针都不能赋给void*

=========================================================================================

const char *p; //*p是const,p可变:const 后面紧跟的是char,所以*p是一个char字符,不可变

const (char *) p;//p是const,*p可变:const 后面紧跟的是(char *)这个整体,所以p是char*类型,不可变。

char* const p; //p是const,*p可变:const 后面紧跟的是p,所以p不可变

const char* const p; //p和*p都是const:第一个const后面紧跟的是char,所以char类型的字符*p不可变;第二个const后面紧跟的是p,所以p不可变。

char const * p;// *p是const,p可变:const后面紧跟的是*,但是单独的*不能表明修饰的内容,所以将*p看成一个整体,所以const修饰的是*p,*p不可变。

(char*) const p;//p是const,*p可变:const紧跟的是p,所以p不可变。

char* const p;// p是const,*p可变:const紧跟的是p,所以p不可变。

char const* const p;// p和*p都是const:第一个const紧跟的是*,不能表明修饰的内容,将后面整体的(* const p)看成一个整体,那就说明*p不可变,第二个const后面紧跟的是p,所以p不可变。
--------------------- 

C/C++ 中关于以下三种定义:


const char *ptr;

char const *ptr;

char * const ptr;
现整理三者之间的区别与联系。

一、const char *ptr;

定义一个指向字符常量的指针,这里,ptr是一个指向
 char* 类型的常量,所以不能用ptr来修改所指向的内容,换句话说,*ptr的值为const,不能修改。但是ptr的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对ptr而言,这个值是常量。实验如下:ptr指向str,而str不是const,可以直接通过str变量来修改str的值,但是确不能通过ptr指针来修改。

gcc编译报错信息:

注释掉16行ptr[0] = 's';运行正常,运行结果为:
hello world
gello world
另外还可以通过重新赋值给该指针来修改指针指向的值,如上代码中取消7、18行的注释,运行结果为:
hello world
good game!!

二、char const *ptr;
此种写法和const char *等价,大家可以自行实验验证。

三、char
 * const ptr;

定义一个指向字符的指针常数,即const指针,实验得知,不能修改ptr指针,但是可以修改该指针指向的内容。实验如下:

gcc报错信息:

注释掉17行代码运行正常,运行结果为:
hello
 world
sello world
--------------------- 
作者:SilentOB 
来源:CSDN 
原文:https://blog.csdn.net/SilentOB/article/details/76994618 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

 

 

阿诺德渲染器gpu需要学习么?运行JSONEncode时是否可以排除已经为JSON的字段?Comparetrue/falsearraywithotherarray

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。