指针那些事(算术运算、和数组的关系)
来源:互联网 发布: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++非法。
- 指针那些事(算术运算、和数组的关系)
- 4.3 指针,数组和指针算术之间关系
- 指针的算术运算
- 指针的算术运算
- 指针的算术运算
- 指针的算术运算
- 指针的算术运算
- 指针的算术运算
- 指针的算术运算
- 指针的算术运算
- 指针的算术运算
- 算术和关系运算符
- (21)算术运算符、逻辑和关系运算符
- MathJax 支持的 Latex 符号总结(关系运算符和算术运算符)
- 1. 指针的算术运算
- 指针运算——算术运算、关系运算
- 指针运算——算术运算、关系运算
- 指针运算——算术运算、关系运算
- C#webApi
- STL--vector容器用法
- 注释转换
- X210v3S的BSP构建之uboot移植(一)
- selenium模拟浏览器爬人民网微博
- 指针那些事(算术运算、和数组的关系)
- Best Time to Buy and Sell Stock
- unity shader:非真实感渲染
- java 十进制转二进制、八进制、十六进制代码复用
- Java中servlet的实现过程
- ios 视频录制
- c# -- mysql中的读取数据的几个方法
- [Javascript 高级程序设计]学习心得记录9 js面向对象
- java接口类和抽象类