关于指针的运算
2018-04-11 19:25
134 查看
一、指针+数字 在我们编写程序时,指针常常被我们用在数组中批量处理数据,而在批量处理数据时我们会用到循环来做,也就需要做指针++的运算,那么问题来了:在做指针加法时是如何加的?
由上图,关于指针加数字这个问题我们可以得到以下几种猜测:1、加一个字节 放第一个数据进去(用十六进制表示,PC是小端,低地址放小数据)
放第二个数据进去
如图所示,表示的数字完全不对了2、加一个数组长度 显然,这个猜测是错误的,加一个数组的长度出现了越界的情况。
3、加一个格子
这样一来,解引用时每次解一个格子(在整型中就是四个字节)所得的结果才为正确的。因此,我们得到结论:指针+数字,需要调整,调整的权重为sizeof(指针去掉一个*)int main()
{
int *p = (int *)2000;
printf("%d\n",p+2);
printf("%d\n",(short *)p+2);
printf("%d\n",(float *)p+2);
printf("%d\n",(double **)p+2);
printf("%d\n",(char *)p+2);
printf("%d\n",(unsigned long)p+2); return 0;
}打印结果为:2008;2004;2008;2008;2002;2002
二、指针 - 数字
可以由指针加数字同理;指针 - 数字需要调整,调整的权重为sizeof(指针去掉一个*)三、指针+指针
指针加指针使非法的四、指针 - 指针 因为一个指针指向的是一个格子,因此两个指针相减,表示的是他们之间相隔的格子数;因此在做指针减指针时首先得出相隔的字节数,然后除以权重(sizeof(指针去掉一个*))
由上图,关于指针加数字这个问题我们可以得到以下几种猜测:1、加一个字节 放第一个数据进去(用十六进制表示,PC是小端,低地址放小数据)
放第二个数据进去
如图所示,表示的数字完全不对了2、加一个数组长度 显然,这个猜测是错误的,加一个数组的长度出现了越界的情况。
3、加一个格子
这样一来,解引用时每次解一个格子(在整型中就是四个字节)所得的结果才为正确的。因此,我们得到结论:指针+数字,需要调整,调整的权重为sizeof(指针去掉一个*)int main()
{
int *p = (int *)2000;
printf("%d\n",p+2);
printf("%d\n",(short *)p+2);
printf("%d\n",(float *)p+2);
printf("%d\n",(double **)p+2);
printf("%d\n",(char *)p+2);
printf("%d\n",(unsigned long)p+2); return 0;
}打印结果为:2008;2004;2008;2008;2002;2002
二、指针 - 数字
可以由指针加数字同理;指针 - 数字需要调整,调整的权重为sizeof(指针去掉一个*)三、指针+指针
指针加指针使非法的四、指针 - 指针 因为一个指针指向的是一个格子,因此两个指针相减,表示的是他们之间相隔的格子数;因此在做指针减指针时首先得出相隔的字节数,然后除以权重(sizeof(指针去掉一个*))
相关文章推荐
- C语言中关于指针的数据类型和指针运算的小结
- 关于指针的浅析----------指针的运算
- 关于“指针在任何情况下都可进行>, <, >=, <=, = =运算”的判断
- 关于C中指针的运算的研究
- 关于C语言中指针运算以及参数入栈顺序的面试题
- 关于多重间接运算指针的const问题
- [C++]指针运算中关于*和&符号的运算实验
- 关于指针的算术运算
- 关于指针运算的小体会
- 关于c++指针大小的问题
- 关于“指针成员的指针型行为或值型行为”
- 关于C++中函数指针的使用
- 一个有意思的关于函数指针用在vector里的模型
- 关于编译错误--提领指向不完全类型的指针
- 关于指针
- Oracle中关于并集/交集/差集的运算
- 关于C# this 指针
- 关于基类指针、派生类指针、基类对象派、生类对象问题
- short运算关于"="与"+=";
- 关于数组名与指针的相互转换