C 不同类型指针的相互转化


        写C已经有一段时间了,今天听到有人说C的不同指针类型不能相互转化!我不相信,但毕竟对方资历比我深,慎重起见,只是笑过。

        但一直想着这个问题,于是刚才写了一个简单的Demo,测试了C指针的性能!年轻就是要敢于质疑!


        我还记得之前看过Windows程序设计时,很多函数使用了类似 以下的写法,所以才确信自己的想法!    

     void* p;
     p=(void*)fs;    // FILE* fs;

        

        我对C指针的理解是:指针只是一个内存块,内存块存的值就是地址,可以只是一个byte,也可以是多个byte连成的内存块的首地址。C的结构体就是一内存块,结构体指针即是指向此内存块的首地址,而指针的类型,用来表示这个内存块的解析规则,如第一个域是char,第二个域是int,则调用struct_name->char_domain时,是首地址,而调用的是int域时,即是首地址+4(不是加1,有字节对齐的情况)。那么用任意的解析规则也是可以的!就是怕崩掉!编译器会阻止。不过不排除有谁能骗过编译器的情况啊!

        此程序在win7 操作系统上测试通过,使用MinGW gcc 3.4.0编译器。


#include 
#include 
#include 

struct __mem{
	
	char x;
	int y;
};

struct _mem_x{

	int x;
	char y;
};

// 定义内存中的一个字节内存单元
typedef unsigned char _byte;
// 定义了一次访问4字的解析规则
typedef long _PTR;

int
main(int argc,char** argv){
        // 此处分配的内存用来做内存访问测试,根据不同的解析规则
        struct __mem* m=(__mem*)malloc(8);
        void* pM;
	_byte* _bs;
        // 定义了与__mem结构不同的内存解析规则
        struct _mem_x* mx;
	int i;
	
        // 先转化成中间变量
	pM=(void*)m;
	printf("%d \r\n",pM);
        // 指针类型转化
        _ptr=(_PTR*)pM;
	printf("%d    %d \r\n",_ptr,*(_ptr));
        // 指针类型转化
        _bs=(_byte*)pM;
	for(i=0;i<8;i++){
		printf("%d   %d \r\n",_bs,*_bs);
		_bs++;
	}
        // 指针类型转化
        mx=(_mem_x*)pM;
	printf("%d    %d \r\n ",&(mx->x),mx);
	printf("%d\r\n ",&(mx->y));
	return 0;
}
 

C 不同类型指针的相互转化_第1张图片

在我的机器上显示的结果如上:

1行)6893520     内存块m的首地址;

2行)6893520     内存块m的首地址,6885104   内存当前的值(未使用memset());

3-10行)6893520 - 6893527 是内存块的地址序列, 后接的值即是当前内存单元(以byte方式访问)  的值。

11行)6893520   即是使用_mem_x结构体的指针访问第一个域int的地址,也是此内存块的首地址,6893520   内存单元首地址。

12行) 6893524    使用_mem_x结构体指针访问域char的地址,即是内存块首地址+4(注,此处不能使用mx+4得到char域的地址,因为+4的意思是+4*sizeof(_mem_x))。


你可能感兴趣的:(C,Linux)