指针运算 注意void指针

    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int n = sizeof(arr)/sizeof(arr[0]);
    int *p = arr;
    int *q = &arr[9];
    printf("%d \n",q-p);

    char abrr[] = {1,2,3,4,5,6,7,8,9,10};
    char nb = sizeof(arr)/sizeof(arr[0]);
    char *pb = abrr;
    char *qb = &abrr[9];
    printf("%d \n",qb-pb);

    double adrr[] = {1,2,3,4,5,6,7,8,9,10};
    double nd = sizeof(adrr)/sizeof(adrr[0]);
    double *pd = adrr;
    double *qd = &adrr[9];
    printf("%d \n",q-p);

指针做减法运算,得到的结果为:两个地址之间相隔的单元格数。但是,不同类型指针做减法是不合法的。

所以上述代码运行结果:

另外:指针加指针 不合法

指针加减数字:合法。

那么无类型指针呢?

例如:

int a = 10;

void * p = &a;

思考:p++是否合法??

思考:*p = 20;//解引用 给a赋值20   是否合法??

答案是不合法的。项明白了这个就知道了,为什么指针可以做减法运算和自减了,就是因为一个前提:知道指针的类型,int*的指针,那么指针减减就是指针见一的单元格,单元格是4个字节,char*的指针减减,就是一个单元格一个字节。

所以void * ,无类型,做指针减法运算就不知道一个单元格是几个字节了,也就无法运算,所以不合法。

同理,不知道指针的数据类型,也就不知道解引用的数据类型,所以就不能解引用。

猜你喜欢

转载自blog.csdn.net/zDavid_2018/article/details/83052393