【问题标题】:passing c pointers through multiple levels of call通过多级调用传递 c 指针
【发布时间】:2017-02-24 22:19:29
【问题描述】:

我正在做一个班级作业(这就是为什么只显示相关代码的原因)。我已经分配了一个指向随机数数组的指针数组,并且必须使用冒泡排序技术。

数组设置如下:

int array[DATASIZE] = {71, 1899, 272, 1694, 1697, 296, 722, 12, 2726, 1899};
int *arrayPointers = array; // donation array

函数调用来自main,看起来如下:

bubbleSort(arrayPointers);

我必须在一个单独的函数中交换指针:

void pointerSwap( int *a , int *b)
{
// swap the pointers and store in a temp
int temp = *a; // temp storage of pointer a while being reassigned
*a = *b;
*b = temp;
}// end of pointerSwap

来自实际的冒泡排序:

void bubbleSort (int *toStore)
{
//sort each of the pointers successively
int i,j; // counters
for (i=DATASIZE-1;i>1;i--)
    {
    for (j=0;j<DATASIZE-1;j++)
        {
        if (toStore[j]>toStore[j+1])
            {
            pointerSwap(toStore[j],toStore[j+1]);
            }// end of if?
        }// end of j for loop
    }// end of i for loop
}// end of buubleSort

我的问题是,当我尝试编译代码时,调用指针交换时出现以下错误:


传递“pointerSwap”的参数 1 使指针从整数而不进行强制转换
注意:预期为“int *”,但参数为“int”类型
传递“pointerSwap”的参数 2 使指针来自整数而不进行强制转换
注意:预期为“int *”,但参数的类型为“int”


我不确定我做错了什么,我尝试了“&toStore[j]”和“&toStore[j+1]”,但是列表对原始数组而不是指向数组进行排序(这是意料之中的)。

非常感谢任何帮助,
~乔伊

【问题讨论】:

  • 但是您在哪里定义了另一个存储位置以避免就地排序?注意:toStore+j 的指针更清晰。
  • 外部 for 循环中的 j 是怎么回事?那不应该是我吗?
  • 因为你有一个函数void bubbleSort (int *toStore),它只接受一个参数并且不返回任何东西,除了对传递的数组进行排序之外,该函数还能做什么呢?如果您不想更改原始数组,则必须在某个地方复制它。请提供您拨打bubbleSort的代码。
  • pointerSwap 是否应该交换指针或交换指针指向的值?在它交换值的那一刻,顾名思义它应该交换指针
  • 它应该交换指针,以便原始列表保持不变

标签: c arrays pointers bubble-sort


【解决方案1】:

在通话中:

pointerSwap(toStore[j],toStore[j+1]);

您正在将inttoStore[j] 等同于*(toStore + j))传递给需要指针的函数。你需要传递一个指针,即:

pointerSwap(toStore + j, toStore + j + 1);

第二个问题是关于排序不合适的。您的函数签名不允许其他任何内容:

void bubbleSort (int *toStore)

您没有返回任何内容,也没有提供对第二个数组的引用,因此您只能在适当的位置进行排序。如果你真的需要一个单独的数组,你可以这样做:

int *bubbleSort (int *input) {
    int* toStore = malloc(DATASIZE * sizeof(int));
    memcpy(toStore, input, DATASIZE);
    ...
    //sort toStore
    ...
    return toStore
}

这将返回一个排序后的数组,并且不会触及原始数组。

【讨论】:

  • 他说他做了 "&toStore[j]" 和 "&toStore[j+1]" - 这是同一件事,它编译但做错了事
  • 所以代码可以编译,但是当我运行代码时,它仍然会修改原始数组而不是指向的数组...
  • 所以还是把指针数组指向函数然后按照上面的操作会改变指针数组中的信息吗?
  • @Joey 它将整个数组复制到一个新位置。就地排序 that 数组,并从函数中将其作为int* 返回。原始数组不会被触及。
  • 我的作业要求第二个数组是指向原始指针的数组,它对原始值进行排序,如果这样的话,排序会以指针形式存储...跨度>
【解决方案2】:

只是为了扩展先前的答案...

在 C 中,括号运算符 [] 等价于 *(),因此

a[5]

等价于

*(a + 5)

两者都向指针添加偏移量以获取新指针,然后获取指向的值。当您将 toStore[j] 传递给 pointerSwap 时,当您想要传递指针时,您传递的是 toStore 的第 j 个元素中的整数值,以便 Store 可以交换位置处的值。

你想要的是

(toStore + j) 

而不是

*(toStore + j)

Fun C trivia:这些都是等价的表达方式

toStore[j]
*(toStore + j)
*(j + toStore)
j[toStore]

练习:为什么这不适用于 C++?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2020-03-14
    • 2012-03-03
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多