指针运算

来源:互联网 发布:深圳户口 知乎 编辑:程序博客网 时间:2024/05/21 19:41

指针

1.指针±指针

指针+指针  错误
指针-指针   得到之间间隔的单元个数。
1)、算出间隔的字节数
2)、除以调整的权重

eg:
#include <stdio.h>
#include <stdlib.h>

int main()
{
int arr[10] = {};//x
int *p = &arr[1];//x+4
int *q = &arr[9];//x+36
printf("%d",p-q);//-8
printf("%d",q-p);//8
printf("%d",(char *)q-(char *)p);//32
printf("%d",(char ***)q-(char ***)p);//8
printf("%d",(double *)q-(double *)p);//4
printf("%d",(short *)q-(short *)p);//16
printf("%d",(int)q-(int)p);//32

return 0;
}

2.指针的算术运算+,-
eg1:
int main()
{
int *p  = (int *)0x2010;
printf("%x",p-2);//2008
printf("%x",(char *)p-2);//200e
printf("%x",(short **)p-2);//2008
printf("%x",(long *)p-2);//2008
printf("%x",(double *)p-2);//2000
printf("%x",(long long)p-2);//200e

return 0;
}

eg2:
int main()
{
int *p = (int *)100;
printf("%d",p+2);//108
printf("%d",(char **)p+2);//108
printf("%d",(short *)p+2);//104
printf("%d",(long long *)p+2);//116
printf("%d",(float *)p+2);//108
printf("%d",(double *)p+2);//116
printf("%d",(unsigned long)p+2);//102

return 0;
}

3.指针加法需要调整,调整的权重为指针本身去掉一个*号,然后求sizeof
如,指针p+-n,实际加的地址为p+-n*(sizeof(*p))

eg:
int main()
{
int arr[10] = {1,2,3,4,5,6};
int *p = arr;
*p = 10;
p++;//加一个单元格
//p = (int *)((int )p + 1);
*p = 20;
printf("%d,%x,%d",arr[0],arr[0],arr[1]);

return 0;
}

//指针
void Fun(int **pp)
{
*pp = NULL;
}

int main()
{
int a  = 10;
int *p = &a;
//p = NULL;//NULL是无效指针
Fun(&p);//目的:同上p=NULL;一样的效果。
printf("%d,%d",p,*p);//0

return 0;
}


通过交换函数体会指针

void Swap_err1(int a,intb)//只修改形参值
{
int tmp = a;
a = b;
b = tmp;
//printf("%d,%d",a,b);
}

void Swap_err2(int *p1,int*p2)//传指针但没有解引用,只修改形参的值
{
int *tmp = p1;
p1 = p2;
p2 = tmp;
}

void Swap_err3(int *p1,int*p2)//野指针
{
int*tmp;//野指针,悬挂指针,没有访问权限
*tmp = *p1;//崩溃
*p1 = *p2;
*p2 = *tmp;
}

void Swap(int *p1,int*p2)//子函数的改变要想影响到父函数:1、传指针;2、解引用
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}

int main()
{
int a = 10;
int b = 20;
printf("%d,%d
",a,b);

//Swap(a,b);
Swap(&a,&b);
printf("%d,%d",a,b);

return 0;
}


多级指针的例子:
int main()
{
int a = 10;
int b = 20;
int *p = &a;
//printf("%d",sizeof(p));
*p =100;//间接访问符,解引用 a = 100;
p = &b;
*p = 200;//b = 200;
int **pp = &p;
*pp = &a;
**pp = 1000;
*pp = &b;
**pp = 2000;

return 0;
}

原创粉丝点击