void指针的转换(2)

void类型指针能够通过显式转换为具有更小或同样存储对齐限制的指针。但数据可能失真。所谓“同样存储对齐限制”是指void类型指针所指的数据在内存中所占的长度与显式转换后的指针所指的数据在内存中所占的长度相等,比方以上程序中的p1所指的原数据在内存中占2个字节,p2所指的数据在内存中也是占两个数据。

但应注意的是。仅仅有上面的这样的转换前后指针所指数据类型一致的转换才保持数据不失真,假设类型不一致,即使具有同样存储对齐限制,也有可能失真,比方由short转向unsigned short,请看下面程序:

#include<stdio.h>

int main(void)

{

short a=-5,*p1=&a;

unsigned short *p2;

void *p3;

p3=(void *)p1;

p2=(unsigned short *)p3;

printf("%d\n",*p2);

return 0;

}

其输出结果就不再是-5了。由于在指针转换时,short类型的数据也经过转换变成了unsigned short类型的数据,详细的转换过程请參考数据类型转换。

只是,也有数值不变的情况,如把a值变为5。

同理,假设是将void类型转换为具有更小存储对齐限制的指针时,也可能引起数值的改变。请看下面程序:

#include<stdio.h>

int main(void)

{

short a=720;

char *p1;

void *p2;

p2=(void *)&a;

p1=(char *)p2;

printf("%d\n",*p1);

return 0;

}

p1所指向的数据不再是720,而是-48。由于a的值720在内存中的表示形式为D0 02(十六进制表示,共两块,即两个字节),当中D0的地址即a的地址:0x0012ff7c。p2仅仅保存0x0012ff7c,不知道它占有两字节内存空间。而p1所指数据占有一字节。因此p1仅仅代表D0。无法代表D0 02。将D0翻译成有符号char类型,即-48(D0是补码)。当然。假设将a的值改为较小的数(-128~127)。如3,转换后的值变不会发生改变。

综上两种情况,事实上void类型指针所指向的数据一直都在内存中存放着,并没有被修改。而仅仅是我们在引用时从内存中提取数据的过程中发生了提取错误。道理非常easy,一个有两字节组成的数据。而你非要提取一字节,是有可能错误发生的(但不是一定会错误发生。当一个数据既能用一字节表示,又能用两字节表示时就不会产生错误)。假设我们提取正确的话。随时都能够得到正确的数据。比方将上面的printf("%d\n",*p1);改为printf("%d\n",*(short *)p1);则又会输出720。

3.假设将void类型的指针转换为具有更大存储对齐限制的指针时。则会产生无效值。例如以下面程序:

#include<stdio.h>

int main(void)

{

short a=23;

void *p1;

int *p2;

p1=(void *)&a;

p2=(int *)p1;

printf("%d\n",*p2);      return 0;

}

其返回值为-859045865

时间: 2024-11-07 11:19:39

void指针的转换(2)的相关文章

C++ Primer 学习笔记与思考_7 void和void*指针的使用方法

(一)void的含义 void的字面意思是"无类型",void差点儿仅仅有"凝视"和限制程序的作用,由于从来没有人会定义一个void变量,让我们试着来定义: void a; 这行语句编译时会出错.提示"illegal use of type 'void'".只是.即使void a的编译不会出错.它也没有不论什么实际意义. void真正发挥的作用在于: (1) 对函数返回的限定: (2) 对函数參数的限定. int f(void); equal t

void及void指针类型

1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并 详述void及void指针类型的使用方法与技巧. 2.void的含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据. void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义: void a; 这行语句编译时会出错,提示“illegal use of ty

void和void*指针的一些理解

void 和 void* 指针分别表示无类型和无类型指针. void 的作用是限制: 1,函数无返回值. 2,函数无参数. 当函数的返还值无参数的时候一定要加上 void ,因为在缺省的状态下函数的返还值是 int ,并且如果不需要的时候就一定要将他声明成 void 类型这样看着更明显.当函数无参数的时候在声明的时候也要加上 void 的这也是一个好习惯,增强了可读性,当然在 K&R C 中是允许在声明的时候省去参数的. void 类型的和指针可以接受任何类型的类型的指针的赋值(但是不代表这个v

void类型及void指针

1.概述 许多初学者对C/C 语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并 详述void及void指针类型的使用方法与技巧. 2.void的含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据. void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义: void a; 这行语句编译时会出错,提示“illegal use of typ

对象布局已知时 C++ 对象指针的转换时地址调整

在我调试和研究 netscape 系浏览器插件开发时,注意到了这个问题.即,在对象布局已知(即对象之间具有继承关系)时,不同类型对象的指针进行转换(不管是隐式的从下向上转换,还是强制的从上到下转换)时,编译器会根据对象布局对相应的指针的值进行调整.不管是 microsoft 的编译器,还是 gcc 编译器都会做这个动作,因为这和 C++ 对象模型有关. 举一个简单的例子,如下代码: #include <stdio.h> class A { public: int x; void foo1()

id 与void *类型的转换(转)

在ARC 无效时,像以下代码这样将id 变量强制转换void * 变量并不会出问题./* ARC 无效 */id obj = [[NSObject alloc] init];void *p = obj; 更进一步,将该void * 变量赋值给id 变量中,调用其实例方法,运行时也不会有问题./* ARC 无效 */id o = p;[o release]; 但是在ARC 有效时这便会引起编译错误.error: implicit conversion of an Objective-C point

void指针

1回顶部 热门文章:C++中extern “C”含义深层探索 编程实现盗2005版QQ源码 1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧. 2.void的含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据. void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试

转载--void指针(void *的用法)

转自:jimmy 指针有两个属性:指向变量/对象的地址和长度 但是指针只存储地址,长度则取决于指针的类型 编译器根据指针的类型从指针指向的地址向后寻址 指针类型不同则寻址范围也不同,比如: int*从指定地址向后寻找4字节作为变量的存储单元 double*从指定地址向后寻找8字节作为变量的存储单元 1.void指针是一种特别的指针    void *vp    //说它特别是因为它没有类型    //或者说这个类型不能判断出指向对象的长度 2.任何指针都可以赋值给void指针    type *

void及void指针介绍【转】

本文转载自:http://blog.csdn.net/renren900207/article/details/20769503 void类型指针(如void *p)所指向的数据类型不是确定的,或者说,可以是任何类型的.void类型指针中的数据不能访问,如果非要访问的话,可以通过显式转换将void类型指针转换为与所指向的数据类型相符的类型. 1.任何类型的指针都可以显式转换为void类型,且不会丢失数据. 2.void类型指针可以通过显式转换为具有更小或相同存储对齐限制的指针,但数据可能失真.所