指针类型和指向的数据类型

 

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
}

 

posted @ 2019-08-05 10:49  Coding_Changes_LIfe  阅读(2840)  评论(0编辑  收藏  举报