1、指针类型和指向的数据类型不同时
#include <stdio.h> //指针除了指明地址以外,还指明了类型,类型决定了数据的大小和数据的解析方式 int main() { char ch='a'; int i= 100000; double d= 1444.54; float f=123.4f; char * pch = &ch; int *pi = &i; double *pd = &d; float *pf =&i; pch =pi; //指针char类型字节数小于int类型 ,*pch漏读 //pch是char类型的指针,它会从&ch开始的地址往后读char指针类型长度的数据,也就是1个字节的数据,而pi的数据有四个字节,有3个字节的数据读不到 pd =pi; //指针double类型字节数大于int 类型, *pd多读 //pd是double类型的指针,它会从&pd开始的地址往后读double指针类型长度的数据,也就是8个字节的数据,而pi的数据有四个字节,会导致往后多读4个字节的垃圾数据 pf=pi; //指针float类型字节数等于int 类型, 不会多读或漏读,但是同样的二进制数,int和float的解析方式不一样,也会导致*pf读的内容错误 printf("%c,%f,%f\n",*pch,*pd,*pf); //结论:指针类型尽量一致,如果不一致,或大或小都有问题 //不同数据类型,大小不一样,解析方式也会不一样,即使地址相同,大小相同 return 0; pch =(char *)0x645afed; //强制类型转换,指明只能从0x645afed往后读取char类型个字节 }
2、指针类型和指向的数据类型相同时
#include <stdio.h> //用于数据通信,共用一个变量 void main() { int num =5; int *p1 =# int *p2 =p1; printf("%d,%d,%d\n",num,*p1,*p2); //5,5,5 *p1 = 10; printf("%d,%d,%d\n",num,*p1,*p2); //10,10,10 *p2 =100; printf("%d,%d,%d\n",num,*p1,*p2); //100,100,100 }