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
求理由 展开
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
求理由 展开
2个回答
展开全部
逻辑有问题:
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]的操作是一样的。
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]的操作是一样的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询