【问题标题】:Trouble with sorting arrays with pointers in C在 C 中使用指针对数组进行排序时遇到问题
【发布时间】:2016-03-04 04:28:48
【问题描述】:

我试图让我的程序显示原始数组,然后对其进行排序并用指针显示排序后的数组,然后最终以原始状态显示数组。 到目前为止,我已经得到了要显示的原始数组和排序数组,但是第三个显示也显示为排序数组。但我需要它处于原始状态。 我认为我没有正确使用指针并且我实际上正在更改数组,如果有人可以向我解释错误在哪里,将不胜感激!

#include <stdio.h>
#include <stdlib.h>


void printArrayO(int DataArr[], int size)
{
   // for loop used to print array contents 10 per line
   for (int i = 0; i < size; i++)
    {
       if ((i % 10) == 0)
       {
          printf("\n");
       }// end of if statement
         // printing with a field size of 5
          printf("%*d", 5, DataArr[i]);
    }// end of for loop

    printf("\n");
}// end of void print function


void bubbleSortArray(int ArrPoint[], int size)
{
   double temp;   // temporary variable

    // for loops used to sort the numbers
   for (int i = 0; i < size; i++) // check if this is right for first for loop
   {
      for (int j = 0; j < (size - 1) - i; j++)
      {
         if (ArrPoint[j] > ArrPoint[j + 1])
         {
            temp = ArrPoint[j];
            ArrPoint[j] = ArrPoint[j + 1];
            ArrPoint[j + 1] = temp;
         }// end of if statement
      }// end of nested for loop
   }// end of for loop

}// end of void bubble sort function */



// print array function
void printArray(int ArrPoint[], int size)
{
   // for loop used to print array contents 10 per line
   for (int i = 0; i < size; i++)
    {
        // possible make a count variable and then use it to make a new line if   %10 ==0
       if ((i % 10) == 0)
       {
          printf("\n");
       }// end of if statement
         // printing with a field size of 5
          printf("%*d", 5, ArrPoint[i]);
    }// end of for loop

    printf("\n");
}// end of void print function



int main()
{
    // given numbers for the main array
    int DataArr[150] = {71, 1899, 272, 1694, 1697, 296, 722, 12, 2726, 1899,
1374, 1541, 1923, 1904, 1083, 1462, 2981, 1929, 304, 2550,
1059, 1860, 1963, 516, 647, 1607, 590, 157, 2351, 753,
2455, 349, 79, 1634, 368, 1992, 2401, 357, 1478, 1601,
239, 365, 2453, 2283, 2432, 1223, 2739, 2487, 2714, 1391,
1972, 2805, 1504, 413, 1647, 2750, 44, 64, 934, 1008,
1429, 1427, 315, 2499, 1620, 1816, 2441, 2557, 2188, 531,
1514, 2825, 449, 265, 2064, 1022, 34, 1864, 1861, 1516,
1465, 2327, 398, 2769, 563, 194, 429, 942, 1795, 223,
2406, 780, 780, 61, 133, 195, 495, 1774, 1934, 2171,
433, 1417, 292, 324, 2929, 1597, 1470, 764, 593, 891,
679, 47, 1778, 2532, 1862, 2636, 549, 2923, 2270, 1101,
1607, 2395, 726, 1111, 892, 1988, 555, 379, 224, 298,
1660, 2203, 2385, 2159, 2574, 705, 2513, 1755, 313, 173,
148, 2449, 259, 1006, 1221, 2259, 2020, 1484, 2717, 2400};



// array of int pointers
int *Arrpoint = &DataArr;
int *Arrpoint2 = &DataArr;
// *pointer[i] to use;


printf("Array in the original order");
printf("\n");
printArrayO(DataArr[150], 150);


printf("\n");
printf("Array after being sorted \n");
bubbleSortArray(Arrpoint[150], 150);
printArray(Arrpoint[150], 150);

printf("\n");
printf("Array in original order again \n");
printArrayO(DataArr[150], 150);





return 0;

}

【问题讨论】:

  • 您的代码到处都有导致未定义行为的错误。例如,printArrayO(DataArr[150], 150); 是缓冲区溢出(有效索引从 0 到 149)。无论如何,这是完全错误的,因为DataArr[i]int,但该函数需要int *。如果您注意编译器警告并修复所有这些错误,那么其中许多错误不应该存在。建议您这样做并重新发布您的问题。
  • Arrpoint 不是 int 指针数组。 Arrpoint2 也不是。而Arrpoint[150] 是越界读取,它不是整个数组。
  • 一个好的起点是启用编译器警告,然后在寻求帮助之前全部消除它们
  • 函数printArray0printArray 是相同的。那应该警告你,DataArrayArrPoint 都包含整数。

标签: c arrays sorting pointers


【解决方案1】:

C 中指针的一种用途是将数组传递给函数,但如果这样做,则数组的唯一副本可以永远更改,除非函数只打印数组。

做你想做的事,

const int nums[150],unsorted[150],sorted[150];

然后是 4 个步骤,

  1. 初始化数字。

  2. 将 nums 复制到未排序的位置。

  3. 将 unsorted 传递给 function(),它返回指向 sorted 的指针。

  4. 打印数字,已排序,未排序。

【讨论】:

    【解决方案2】:

    int* Arrpoint = &amp;DataArr 不会复制DataArr。它只是使Arrpoint 指向DataArr,因此您通过Arrpoint 所做的任何更改都将反映在DataArr 中。

    在这种情况下,您必须复制数组才能执行您想要的操作。

    int a[5]={5, 4, 3, 2, 1};
    int* b = malloc(5*sizeof(*b));       // making new array b
    for (int i=0; i<5; i++) b[i]=a[i];  // copying a to b
    print(a, 5);                       // display a (unsorted)
    sort(b, 5);                       // your sort function
    print(b, 5);                     // display b (sorted)
    print(a, 5);                    // display a (unsorted)
    

    【讨论】:

    • 这个问题是关于 C 而不是 C++。
    • 您在最后一行缺少分号。除此之外,我认为它将在 C99 中编译。早期版本的 C 不允许在 for 循环中声明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多