问一道关于指针的笔试问题,高手请进,麻烦了,谢谢!
我遍了一个简单的程序,验证下,发现错误不在除以2那块#include"stdio.h"intmain(){int*p,*q,*m;inta[5],i=9;q=&a[0];...
我遍了一个简单的程序,验证下,发现错误不在除以2那块
#include "stdio.h"
int main()
{
int *p,*q,*m;
int a[5],i=9;
q=&a[0];
m=&a[4];
p=&i;
p=(q+m)/2;
}
错误提示: error: invalid operands of types `int*' and `int*' to binary `operator+'
我把除号去掉,就是p=q+m,也报错
high,low,middle是具有相同类型的指针变量,并且low和high指向数组元素,下面的语句是否合法,若不合法,请问如何修改?
middle=(low+high)/2
这个错在哪里?是除号的问题吗?哪位知道麻烦回答下,谢谢 展开
#include "stdio.h"
int main()
{
int *p,*q,*m;
int a[5],i=9;
q=&a[0];
m=&a[4];
p=&i;
p=(q+m)/2;
}
错误提示: error: invalid operands of types `int*' and `int*' to binary `operator+'
我把除号去掉,就是p=q+m,也报错
high,low,middle是具有相同类型的指针变量,并且low和high指向数组元素,下面的语句是否合法,若不合法,请问如何修改?
middle=(low+high)/2
这个错在哪里?是除号的问题吗?哪位知道麻烦回答下,谢谢 展开
4个回答
展开全部
将p=(q+m)/2;改成*p=(*q+*m)/2;试试
middle=(low+high)/2也改成*middle=(*low+*high)/2;
比如int a[10];int b[10];int *low = a;int *high=b;low和high指向数组首地址;
low和high指向数组第n个元素:low = &a[n];high = &b[n];
low和high是指针指向地址,不是数,所以不能进行数值运算;
middle=(low+high)/2也改成*middle=(*low+*high)/2;
比如int a[10];int b[10];int *low = a;int *high=b;low和high指向数组首地址;
low和high指向数组第n个元素:low = &a[n];high = &b[n];
low和high是指针指向地址,不是数,所以不能进行数值运算;
追问
谢谢你的回答,我这个程序纯粹是为了验证这个问题编的,呵呵。
当指针指向数组的时候是可以进行运算的啊,而且我把等式改成middle=low+(high-low)/2就可以了,是不是指针与指针不能相加?指针指向数组的时候可以运算的意思是不是指针地址+偏移量?
追答
指针之间只能相减或进行比较,不能相加;
指针指向数组的时候可以运算的意思是指针地址+偏移量的意思。
“当指针指向数组的时候是可以进行运算的啊,而且我把等式改成middle=low+(high-low)/2就可以了”,你进行的只是地址的运算:比如:
int* p1;int *p2;
int a[10]={0,10,2,3,4,5,6,7,8,9};
p1=&a[0]+1;
p2=&a[7];
s = (*p2-*p1); //s = -3;是数组里面的值相减
s = (p2-p1); //s = 6;是数组地址的值相减
展开全部
*p=(*q+*m)/2,错误提示意思是不合法的运算对象(整形指针和整形指针的二进制相与)
你的加法是2个整形数相加而不是指针地址相加,没调试器,不保证代码正确
你的加法是2个整形数相加而不是指针地址相加,没调试器,不保证代码正确
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是+号的问题啊,+号两边怎么能是指针类型呢?除非你重载+运算符才能这么用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
错误报告的意思是说编译器没有重载两个指针的加法运算,就像两个类对象如果没有重载加法运算也会出现这种错误
如果想取中间地址那么可以 p = (int*)(long(q)+long(m))/2
如果想取中间地址那么可以 p = (int*)(long(q)+long(m))/2
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询