【问题标题】:Exchange Memory addresses between array's indixes possible?可以在数组索引之间交换内存地址吗?
【发布时间】:2012-10-24 00:03:45
【问题描述】:

我没有太多管理指针和其他高级功能的经验,但我在想是否有可能制定一种算法来使用指针在数组的两个元素之间交换内存地址,而不是复制和移动值每次(排序时的示例)。让我解释一下:

想象一下这个数组有 10 个未排序的元素,我假装使用冒泡排序对其进行排序(以任何顺序),典型的方法是使用辅助变量来复制元素并在每次 i 时将其用作旁路找到一个更小或更大的数字(取决于降序或升序)。

            *----*----*----*----*----*----*----*----*----*----*
array[10] = | 45 | 21 | 32 | 48 | 32 | 22 | 47 | 10 | 11 | 12 |
            *----*----*----*----*----*----*----*----*----*----*
            ^----- Imagine this is 10000

程序意识到数组[1]小于数组[0],因此冒泡排序将使用辅助变量作为旁路交换它们的值(这是典型的方式)。

                   *--------------* 
                   |              ^
                   |              |
            *--------------*--------------*----*----*----*----*----*----*
array[10] = |      45      |      21      | 32 | 22 | 47 | 10 | 11 | 12 |
            *--------------*--------------*----*----*----*----*----*----*
                   |              ^
                   |   *------*   |
                   *-->|BYPASS|---*
                       *------*

所以不能说交换 &array[0] 和 &array[1] 地址之类的东西吗?所以我避免了次要变量?在这种情况下 &array[1] = 10000; &array[0] = 10004.

感谢您的关注,所有建议都可以接受!

【问题讨论】:

  • 不,这是数组的一种点,索引以简单的方式对应于地址。但是为什么要避免使用 temp 变量呢?如果要排序的东西很大,无论如何都应该对指针进行排序。
  • 如果你能以某种方式改变某物的地址(而不是将其复制到新的地方,而是改变地址——不管这意味着什么),世界将不再有意义.不过头像不错。

标签: c algorithm pointers sorting


【解决方案1】:

你可以这样做

 array[0] += array[1];
 array[1] = array[0] - array[1];
 array[0] -= array[1];

不要使用第三个变量。

数组是一个连续的连续内存空间。您无法取消它的订购。它不是一个 LinkedList,你可以像这样交换指针。

【讨论】:

  • 谢谢,当你谈到链表时,你启发了我
  • 我觉得提到列表会让你明白为什么你不能做你想做的事情:) 但是对于心理体操,想想如果你可以交换地址你可以做什么 ELSE 的含义到位。数组如何知道在哪里看?你怎么知道你是否到达了数组的末尾?所有的指针都会立即变成指向指针的指针还是...?从这个意义上说, (char**) 是什么意思?那么汇编程序呢?链接器?编译器?如果你可以交换地址,他们怎么知道生成什么样的代码?堆栈指针?由于不确定性,这一切都不再有意义。
  • 当您的头脑因所有这些而超负荷时,请考虑交叉编译,在一种架构上为另一种架构编译代码。然后考虑生成这样的交叉编译器。突然之间,您会发现它必须以这种方式工作——它目前的工作方式 :) 再说一次,有了适当的硬件支持,您的想法可能是可行的;但它必须在您的硬件上使用定制的、特定于硬件的编译器,其 MMU 和裸机允许在运行时重新映射/重新分配内存。听起来……异国情调:)
猜你喜欢
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
相关资源
最近更新 更多