c++的问题,求助,各位大神,程序如下

#include<iostream>usingnamespacestd;intmain(){voidcompare(int*p);inta[10];int*p=&a[0]... #include <iostream>
using namespace std;
int main()
{
void compare(int * p);
int a[10];
int * p = &a[0];
int i;

for(i = 0; i <= 9; i ++)
{
cin >> a[i];
}

compare(p);

for(i = 0; i <= 9; i ++)
{
cout << a[i] << " "; //为什么这里把 a 换成 p 就不行了,就原样输出来呢
}

cout << endl;

return (0);
}

void compare(int * p)
{
int i = 1, j = 8;
int * temp = (p + i); //, * t = &i;
int * provisional = (p + j);

for(i = 2; i <= 8; i ++)
{
if(* (p + i) < * temp)
{
temp = (p + i);
}
}

for(i = 1; i <= 8; i ++)
{
if((p + i) == temp)
break;
}

* temp = * (p + i); // 想让第一位数和
* (p + i) = * p; //中间最小的数交换
* p = * temp;

for(j = 7; j >= 1; j --)
{
if(* (p + j) > * provisional)
{
provisional = (p + j);
}
}

for(j = 8; j >= 1; j --)
{
if((p + j) == provisional)
break;
}

* provisional = * (p + 9); //想让最后一位数和
* (p + 9) = * (p + j); //中间的最大数交换
* (p + j) = * provisional;
}

我输入的是3 1 9 8 0 7 5 6 4 2,最后黑框输出的是3 1 2 8 3 7 5 6 4 2

求理由
展开
 我来答
Z240433360
2013-05-07
知道答主
回答量:51
采纳率:0%
帮助的人:25.5万
展开全部
for(i = 0; i <= 9; i ++)
{
cout << a[i] << " "; //为什么这里把 a 换成 p 就不行了,就原样输出来呢
}

这里你要换为P的话 就要写成 cout<<*p[i]<<" ";
因为你那样写的话就只表示的是一个地址的,加 * 表示取里面的值
缪立军
2013-05-08 · TA获得超过384个赞
知道小有建树答主
回答量:257
采纳率:100%
帮助的人:170万
展开全部
逻辑有问题:
for(i = 2; i <= 8; i ++)
{
if(* (p + i) < * temp)
{
temp = (p + i);//#1
}
}

for(i = 1; i <= 8; i ++)
{
if((p + i) == temp)
break;
}

* temp = * (p + i); // 想让第一位数和 //#2
* (p + i) = * p; //中间最小的数交换 //#3
* p = * temp; //#4

#1的地方你已经把temp指针指向了p+i的地址,他们指向同一个地址,那么#2这句就没有任何意义,它相当于把自己的值赋给自己,#3相当于把p地址的值赋给p+i地址中,于是最小值的地方的值等于第一个位置的值,但是由于temp也是指向这个地址,所以temp的值也等于第一个位置的值,#4赋值就相当于把第一位置的值又赋值回去了,所以这两个地址的值都是原来第一个位置的值。
改动:
for(i = 2; i <= 8; i ++)
{
if(* (p + i) < * temp)
{
temp = (p + i);
}
}

for(i = 1; i <= 8; i ++)
{
if((p + i) == temp)
break;
}

int t1;
t1 = * (p + i); // 想让第一位数和
* (p + i) = * p; //中间最小的数交换
* p = t1;

补充:而且那个地方换成p一样是可以的,而且结果完全一样,采纳的回答居然是不对的,回答的那个人指针的概念估计跟你差不多,p就是指向数组a的首地址
int * p = &a[0];
等同于
int *p;
p = a;
那么p[i]的操作其实跟a[i]的操作是一样的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式