指针的小问题一个~

时间:2020-12-30 17:38:09

int a[8],*p1=a+2,*p2=a+7,s,s2;
s=p2-p1;/* s的值为5  也就是说 指针与指针间可以相减
那么 指针与指针可以相加吗?
例如:*/
s2=p2+p1 



19 个解决方案

#1


可以啊,指针可以相加减.但注意范围

#2


肯定是可以的。不过注意覆盖底下的值

#3


啊~~  刚才去调试了下  
可是发现两个指针不能相加  提示: cannot add two pointers

#4


要指向同一内容的才可以加~~~~

#5



#include<stdio.h>
int main()
{

int a[8]={9,7,5,3,1,0,8,6};
int *p1=a+2,*p2=a+7,s,s2; /* p1=5,p2=6*/
s=p2-p1;
printf("%d ",p1);   /*088*/
printf("%d ",p2);   /*108 */
/*s=(108-88)/(sizeof(int));*/
printf("%d",s);
}

就这么简单

#6


注意,在C文件的情况下编译

#7


是指向同一个数组了啊...
相减就没问题,相加就有问题了..



#include <stdio.h>
int main()
{int a[8]={0,1,2,3,4,5,6,7},*p1=a+2,*p2=a+4,s,s2;
s=p2-p1;
s2=p2+p1;
printf("%d,%d\n",s,s2);
getchar();
return 0; 
}

#8



#include<stdio.h>
int main()
{

int a[8]={9,7,5,3,1,0,8,6};
int *p1=a+2,*p2=a+7,s,s2; /* p1=5,p2=6*/
s=(int)p2+(int)p1;
printf("%d ",p1);
printf("%d ",p2);
printf("%d",s);
}

p2和p1体现的是地址,要经过转化才行
减法情况下体现出偏移的差值

#9


哦 这样啊..
那为什么 相减就不用转化了啊? 

#10


相减也可以阿,你看到上面你相减的时候不是真实的地址数值相减了吗? 
s=(int)p2-(int)p1;

情况下就是地址数值差了,所以加不加类型强转还是不一样的

#11


哦 ,明白了  谢谢

#12


指针开平方

#13


指针与指针不能相加。不管是不是同类型的指针。

两个对象是否能进行如:"+","-","*","/"等运算,要看它是否重载了这些运算符。
就算重载了,也要看它的参数是什么。

指针重载了“+”运算符,但参数是整数,而不是另一个指针!

不同类型的指针"+1"所作操作是不一致的,主要看它们所指的类型的单位大小来决定具体加多少。
那各位想象,指针+指针会得出什么??

#14


忘了说,指针和指针可以相减,得到的是两地址之间的差。可以用来计算数组的大小等。
但相加却没有实际意义。

#15


int=pointer-pointer<->pointer=pointer+int

#16


相加却没有实际意义  
这个说的好~~  我试了,觉得是没什么意义

#17


13 楼说的有道理啊
指针与指针不能相加。不管是不是同类型的指针。
s=(int)p2-(int)p1;
此时的 p2 和p1 已经被转化成数值了~~

谢谢各位热心的帮助~~

#18


是指向同一个数组了啊... 
相减就没问题,相加就有问题了.. 
-------------------------------------
其实不然,随便指向哪里都可以!只要把指针的值当作整数来处理就行了!

#include <stdio.h>

int main()
{
      int   a=11;
      float b=22;
      int   *pi=&a;
      float *pf=&b;
      int result;
      result=(int)pi-(int)pf;  //将两个指针变量的值转换为整数值参与运算
      printf("%d\n",result);
      return 0;
}

#19


支持14楼的说法
并补充一下
(相同类型的)指针可以相减

#1


可以啊,指针可以相加减.但注意范围

#2


肯定是可以的。不过注意覆盖底下的值

#3


啊~~  刚才去调试了下  
可是发现两个指针不能相加  提示: cannot add two pointers

#4


要指向同一内容的才可以加~~~~

#5



#include<stdio.h>
int main()
{

int a[8]={9,7,5,3,1,0,8,6};
int *p1=a+2,*p2=a+7,s,s2; /* p1=5,p2=6*/
s=p2-p1;
printf("%d ",p1);   /*088*/
printf("%d ",p2);   /*108 */
/*s=(108-88)/(sizeof(int));*/
printf("%d",s);
}

就这么简单

#6


注意,在C文件的情况下编译

#7


是指向同一个数组了啊...
相减就没问题,相加就有问题了..



#include <stdio.h>
int main()
{int a[8]={0,1,2,3,4,5,6,7},*p1=a+2,*p2=a+4,s,s2;
s=p2-p1;
s2=p2+p1;
printf("%d,%d\n",s,s2);
getchar();
return 0; 
}

#8



#include<stdio.h>
int main()
{

int a[8]={9,7,5,3,1,0,8,6};
int *p1=a+2,*p2=a+7,s,s2; /* p1=5,p2=6*/
s=(int)p2+(int)p1;
printf("%d ",p1);
printf("%d ",p2);
printf("%d",s);
}

p2和p1体现的是地址,要经过转化才行
减法情况下体现出偏移的差值

#9


哦 这样啊..
那为什么 相减就不用转化了啊? 

#10


相减也可以阿,你看到上面你相减的时候不是真实的地址数值相减了吗? 
s=(int)p2-(int)p1;

情况下就是地址数值差了,所以加不加类型强转还是不一样的

#11


哦 ,明白了  谢谢

#12


指针开平方

#13


指针与指针不能相加。不管是不是同类型的指针。

两个对象是否能进行如:"+","-","*","/"等运算,要看它是否重载了这些运算符。
就算重载了,也要看它的参数是什么。

指针重载了“+”运算符,但参数是整数,而不是另一个指针!

不同类型的指针"+1"所作操作是不一致的,主要看它们所指的类型的单位大小来决定具体加多少。
那各位想象,指针+指针会得出什么??

#14


忘了说,指针和指针可以相减,得到的是两地址之间的差。可以用来计算数组的大小等。
但相加却没有实际意义。

#15


int=pointer-pointer<->pointer=pointer+int

#16


相加却没有实际意义  
这个说的好~~  我试了,觉得是没什么意义

#17


13 楼说的有道理啊
指针与指针不能相加。不管是不是同类型的指针。
s=(int)p2-(int)p1;
此时的 p2 和p1 已经被转化成数值了~~

谢谢各位热心的帮助~~

#18


是指向同一个数组了啊... 
相减就没问题,相加就有问题了.. 
-------------------------------------
其实不然,随便指向哪里都可以!只要把指针的值当作整数来处理就行了!

#include <stdio.h>

int main()
{
      int   a=11;
      float b=22;
      int   *pi=&a;
      float *pf=&b;
      int result;
      result=(int)pi-(int)pf;  //将两个指针变量的值转换为整数值参与运算
      printf("%d\n",result);
      return 0;
}

#19


支持14楼的说法
并补充一下
(相同类型的)指针可以相减

#20