|
发表于 2010-10-12 17:15:57
|
显示全部楼层
不管对p1、p2、*p1、&p2中哪一个指针来说,它们底层都是一个整型的数值。那么就有:
p2 = *(char **)p1;这种强制转换并没有改变数据,也就是(char**)p1和p1的底层是一样的,那么p2只不过是对p1取值而已。因此:
p2 = *p1
p1 = &p2
p2 = *(char **)p1;可能存在运行时问题的,编译可以通过,但运行就不见得了。
比如,在VC上,p1 = NULL;这句没有问题的语句,在经过*(char**)p1之后就变成对0地址取值了,就会因为内存非法访问而出错。一般来说,对于一级指针,我们总是尽量避免让它指向非法地址;而二级指针则应该避免它自身以及它指向的值指向非法地址,比较容易出错一些,将一级指针强制转换成二级指针时更容易出错。
VC++2010,Win-Tc ,MDK3.5,都很好软件调试的,设个断点,监视一下这些就行了。在PC上,至少0地址是被保护的,取它的值会出错;ARM上,访问不存在的内存应该会引起数据访问异常。
看一下VC下面出错的代码:
#include "stdafx.h"
int main(int argc, char* argv[])
{
char *p1 = 0; //没有用的指针指向0地址,因为p1可能会随时改变,这里我就特意赋值0了
char *p2;
p2 = *(char **)p1; //非法访问p1地址了,调试时会产生异常的
printf("Hello World!\n");
return 0;
} |
|