指针输出结果和用数组输出结果不一样

课本习题:用指向指针的方法对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;
            }
        }
}

不过你这里大可不必这样子修改, 数组名对应的变量 本来就是类似一个指针,可以直接操作

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7458676
  • 你也可以参考下这篇文章:输入n个整数,输出出现次数大于等于数组长度一半的数
  • 除此之外, 这篇博客: 单素数判断(根号n后再优化)和俄罗斯农民乘法(带证明),以及埃筛的证明中的 从而得证,素数平方前的素数倍数都被筛过一次了,所以可以进行一步小优化,即从素数平方开始筛素数倍数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #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;
    	}
    }
    
    
  • 您还可以看一下 纪佳琪老师的机器学习之聚类、主成分分析理论与代码实践课程中的 协方差矩阵的特征值分解算法代码实现小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    根据题目描述,问题是在使用指针进行排序时,排序结果和使用数组排序的结果不一致。首先要确定指针排序的代码逻辑和数组排序的代码逻辑是否一致,如果一致,那么可能是使用指针时出现了一些问题。

    在没有给出具体代码的情况下,我假设指针排序的代码逻辑和数组排序的代码逻辑一致。那么可能的原因是对指针的操作出现了错误。

    下面是一种常见的错误情况,可能会导致指针排序结果与数组排序结果不一致的情况:

    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);
    }
    

    这样,通过指针输出的排序结果就应该和通过数组输出的排序结果一致了。如果问题仍然存在,可能是其他原因导致,请提供更多相关代码,以便进行进一步的分析和解答。