指针那些事(算术运算、和数组的关系)

来源:互联网 发布:navicat linux 安装 编辑:程序博客网 时间:2024/05/15 23:52

指针算术运算有三种:指针加数字、指针减数字、指针减指针。

①指针加减数字

指针加减法需要调整指针,调整的权重是指针本身清楚一个*号,在求sizeof()的长度。

eg:

int main()

{

  int *p=(int *)0x1010;//0x开头说明是16进制数字

  printf("%x\n",p-1);//int权重为4,p-1,故而0x1010-4=100c

  printf("%x\n",p-2);//int权重为4,p-2,故而0x1010-8=1008

  printf("%x\n",(short *)p-2);//short权重是2,故而1010-4=100c

  printf("%x\n",(char *)p-2);//char权重是1,1008

  printf("%x\n",(double *)p-2);//double权重是8,1000

  printf("%x\n",(float *)p-2);//float权重是4,1004

  printf("%x\n",(long long)p-2);//longlong长整型,因为他不是指针,所以是直接在数字上-2,所以得100e

  printf("%x\n",(double **)p-2);//double**去掉一个*以后,还是double*,它仍然是指针,指针都是4个字节,故2*4=8,结果为1008

  printf("%x\n",(char **)p-2);//同上,指针为4个字节,故而结果为1008

  return 0;

}

②指针减指针合法(指针加指针不合法)

a,算出两个指针间隔的字节数,

b,除以调整的权重,调整的权重是指针本身去掉一个*号,再求sizeof()

注意:不同类型指针不能相减

eg:

int main()
{
int arr[10] = {0};
//字节长度总共为40
int *p = &arr[1];//长度为4
int *q = &arr[9];//长度为36
printf("%d\n",p-q);//(4-36)/4=-8
printf("%d\n",q-p);//8
printf("%d\n",(short *)q-(short *)p);//(36-4)/2=16
printf("%d\n",(char **)q-(char **)p);//(36-4)/4=8
printf("%d\n",(double *)q-(double *)p);//32/8=4
printf("%d\n",(long *)q-(long *)p);//32/8=4
printf("%d\n",(char *)q-(char*)p);//32/1=32
printf("%d\n",(long long)q-(long long)p);//不是指针,故而直接相减36-4

//printf("%d\n",(int *)q-(short *)p);//error,不同类型不能相减
return 0;
}


指针与数组的关系:

指针与数组首元素等价。

eg:

*(arr+i) == arr[i]

p[i] == *(p+i)

代码分析:

void InitArr(int *arr,int len)
{
for(int i=0;i<len;i++)
{
*(arr+i) = 0;//等价于
arr[i] = 0
}
}
int main()
{
  int arr[10] = {1,2,3,4,5};
  int *p = arr;
  printf("%d,%d,%d\n",*(p+3),*(arr+3),arr[3]);//*(p+3)等价于*p[3]==4; *(arr+3)等价于arr[3]等价于p[3]==4; arr[3]==p[3]==4;
  p = &arr[5]; //p指向arr[5]的地址
  printf("%d\n",p[-2]);//*(p-2); 则p[-2]表
//p此时指向p[5],示p[5-2]==p[3]==4

InitArr(arr,sizeof(arr)/sizeof(arr[0]));//调用InitArr函数
return 0;
}

*p与arr[]的区别:

以下为例

int arr[10]={1,2,3,4,5};

int *p=arr;

①字节长度不同,sizeof(arr[10])=40;  sizeof(*p)=4;

②指针可以实现指针++,但是数组不可以++,即*p++合法,arr++非法。










原创粉丝点击