指针的运算和强制转换类型

指针
a.指针==地址
b.获得任何变量的地址都是:(取地址符)&变量名
c. * 指针变量名,则间接访问到指针指向的变量

d.同类型赋值

运算
1.  指针+数字   //需要调整,调整的权重(格子大小)为sizeof( 指针去掉*号,相当于解引用)
   比如:*int 调整完后的sizeof为4,**double调整完后的sizeof为4(因为所有指针的大小为4个,去掉一个*号的二级指针仍为一级指针)

(1)加一个单元格 : p++(一个单元格是几个字节取决于指针的类型,比如通常来说在32位平台下,int是4个字节,float 是4个字节,double是8个字节)

#include <stdio.h> //加一个单元格 就把原来的a[0]的1.和a[1]的2分别替换成10和20了
int main()
{
 int arr[]={1,2,3,4};
 int *p = arr;
      *p = 10;
        p++;
      *p = 20;
  printf("%d,%d\n",arr[0],arr[1]);
}

(2)加一个字节  :p=(int *)((int)p+1) 但是通常不用,因为毕竟麻烦


2.指针 - 数字     //运算同加法一样

3.指针 - 指针     //间隔的是单元格数,不是字节数,例子为强制转换的第一个
    方法:1.算出字节数
              2.除以调整的权重
    总结:指针的所有运算都要调整,调整的权重为sizeof(指针去掉一个*号)

强制转换:

1.10进制的减(加)法输出。下面的例子以减法为例

#include <stdio.h>
int main()
{
 int arr[]={0,1,2,3,4,5,6,7,8,9};
 int *q = &arr[1];
 int *p= &arr[9];
 printf("%d\n",p-q);                                     //没有转化类型直接算9-1=8
 printf("%d\n",q-p);                                   //同上 1-9= -8
 printf("%d\n",(short*)p-(short*)q);         //int字节数为4,一共4*8=32个字节数,除以调整的指针short的权重为2,最终为16
 printf("%d\n",(double*)p-(double*)q); //同理除以double的权重为8,最终为4
 printf("%d\n",(int***)p-(int***)q);        //int***去掉一个*号后,为二级指针,权重为4,最终为8
 printf("%d\n",(char**)p-(char**)q);   //char**去掉一个*号后,为一级指针,权重为4,最终为8
 printf("%d\n",(long)p-(long)q);       //long不是指针无法解引用去掉一个*号。相差仍为32个字节数
}
2.16进制的减法输出
#include <stdio.h>
int main()
{
 int *p = (int *)  0x2010;                                 // 向前借一位是16
 printf("%x\n",p-2);                                       //  没有转化类型直接算p-2*4=2008
 printf("%x\n",(float*)p-2);                          //   指针f解引用后float是4字节,因此也是2008
 printf("%x\n",(short*)p-2);                       // 同理short字节数为2,一共4个字节数,十进制的12是十六进制的c,最终为200c
 printf("%x\n",(double*)p-2);                  // 同理double字节数为8,一共16个字节,最终为2000
 printf("%x\n",(unsigned short *)p-2);  //   同理unsigned short字节为2,共4个字节数,最终为200c
 printf("%x\n",(char*)p-2);                   // 同理char为1字节,共2字节,则结果为200e
 printf("%x\n",(long*)p-2);                 //  同理long为4字节,共8字节,则结果为2008
 printf("%x\n",(unsigned long long)p-2); // 无符号long long常量,不是指针,所以仍为2个字节,则结果为200e
}


猜你喜欢

转载自blog.csdn.net/it_bonnie/article/details/79841507