课本习题:用指向指针的方法对n个整数排序
通过指向指针的指针,去改变数组内容,但是用指针输出结果和用数组输出结果不一样:
#include <iostream>
using namespace std;
//用指向指针的方法对n个整数排序
int main()
{
void change(int** p);
const int n = 5;
int a[5],*pstr[5],**p,i;
for (i = 0;i < 5;i++)
{
cin >> a[i];
pstr[i] = &a[i];//指针数组pstr[i]指向a[i]
}
p = pstr;
change(p);
for (i = 0;i < 5;i++)
cout<< *pstr[i] << " "; // ?!!!结果是顺序输出
cout << endl;
for (i = 0;i < 5;i++)
cout << a[i] << " ";//?!!!结果是原始的数组a[n]
return 0;
}
void change(int** p)
{
int i,j,*temp;
for(i=0;i<5;i++)
for (j = i; j < 5;j++)
{
if (**(p + i) > **(p + j))
{
temp = *(p + i);
*(p + i) = *(p + j);
*(p + j) = temp;
}
}
}
你这里交换的是指针,数组的元素又没有改变,它原来位置的值还是原来的
temp = *(p + i);
*(p + i) = *(p + j);
*(p + j) = temp;
你需要这样子修改:
void change(int** p)
{
int i,j,temp;
for(i=0;i<5;i++)
for (j = i; j < 5;j++)
{
if (**(p + i) > **(p + j))
{
temp = **(p + i);
**(p + i) = **(p + j);
**(p + j) = temp;
}
}
}
不过你这里大可不必这样子修改, 数组名对应的变量 本来就是类似一个指针,可以直接操作
#include<bits/stdc++.h>
using namespace std;
int main()
{
int ans[32766];
vector<int> primes;
memset(ans,0,sizeof(ans));primes.clear();
int check;
cin>>check;
for(int i=2;i<=check;i++)
{
if(!ans[i])//没被标记就是素数
{
primes.push_back(i);
}
for(int j=i*i;j<=check;j+=i)//从他的平方开始筛,平方内他的倍数被小于他的质数筛过了
{
ans[j]=1;
}
}
for(int i=0;i<primes.size();i++)
{
cout<<primes[i]<<endl;
}
}
根据题目描述,问题是在使用指针进行排序时,排序结果和使用数组排序的结果不一致。首先要确定指针排序的代码逻辑和数组排序的代码逻辑是否一致,如果一致,那么可能是使用指针时出现了一些问题。
在没有给出具体代码的情况下,我假设指针排序的代码逻辑和数组排序的代码逻辑一致。那么可能的原因是对指针的操作出现了错误。
下面是一种常见的错误情况,可能会导致指针排序结果与数组排序结果不一致的情况:
void pointerSort(int* arr, int size){
// 对指向指针的指针进行排序
int** p = (int**)malloc(size * sizeof(int*));
for(int i=0; i<size; i++){
p[i] = &arr[i];
}
for(int i=0; i<size; i++){
for(int j=i+1; j<size; j++){
if(*p[i] > *p[j]){
int* temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
}
// 输出排序结果
for(int i=0; i<size; i++){
printf("%d ", *p[i]);
}
free(p);
}
在这段代码中,指针数组p中存储的是arr中每个元素的地址。在排序时,交换的是指向指针的指针,而不是数据本身。这可能会导致最终排序结果和通过数组输出排序结果不一致。
解决这个问题的方法是,在交换指针时,应该交换指向的数据而不是指针本身。修改后的代码如下:
void pointerSort(int* arr, int size){
// 对指向指针的指针进行排序
int** p = (int**)malloc(size * sizeof(int*));
for(int i=0; i<size; i++){
p[i] = &arr[i];
}
for(int i=0; i<size; i++){
for(int j=i+1; j<size; j++){
if(*p[i] > *p[j]){
int* temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
}
// 输出排序结果
for(int i=0; i<size; i++){
printf("%d ", **p[i]);
}
free(p);
}
这样,通过指针输出的排序结果就应该和通过数组输出的排序结果一致了。如果问题仍然存在,可能是其他原因导致,请提供更多相关代码,以便进行进一步的分析和解答。