我们可以在C或C ++中交换两个数字而不传递指针或对交换函数的引用吗?

时间:2011-12-15 18:42:18

标签: c++ c

在采访中我被问过这个问题一两次。我不确定是否可能。也许C中的结构是出路?任何人都可以进一步详细说明吗?

12 个答案:

答案 0 :(得分:9)

如果这两个值在结构中,那么您可以使用函数的返回值而不是通过引用传递:

struct twoNumbers {
  int first;
  int second;
};

struct twoNumbers swapNumbers(struct twoNumbers src)
{
  int tmp = src.first;
  src.first = src.second;
  src.second = tmp;
  return src;
}

/* ... */

struct twoNumbers s = { 5, 42 };

s = swapNumbers(s);

......尽管如此,使用指针可能更实际。

答案 1 :(得分:2)

除非交换功能实际上是一个宏,否则它是不可能的。如果你没有通过指针或引用传递,那么你传递的是值,这意味着它将传递一个副本而不是值本身,所以你无法影响调用者范围内的变量,因为值被复制。

你在那里做任何交换,即使使用地址,也不会影响调用者范围内变量的状态。

答案 2 :(得分:2)

假设您需要一个函数来进行交换,并且该函数无法接受引用或指针,我只能想到一种完全不可移植的方法,并且可能无法一致地工作:

交换函数必须检查堆栈以找到调用代码的返回地址。然后它必须向后循环,消除导致调用的代码,识别将参数推入堆栈的指令(或将它们放入参数寄存器,具体取决于平台的标准调用约定),并识别内存位置参数是从中加载的。然后,您可以在这些内存位置中执行值的交换。如果在调用之前没有覆盖它们,你也应该修复用于传输值的中间寄存器。

正如我所说,完全不便携且完全容易出错。但是如果你理解机器架构和名义编译输出足以描述你将如何做到这一点,你可能会给你的面试官留下深刻的印象。

答案 3 :(得分:1)

是的,你可以。这是代码:

int x = 0;
int y = 1;
// Want to swap x and y.
{
  int tmp = x;
  x = y;
  y = tmp;
}
// They have now been swapped. No function calls. No pointers. No references.

答案 4 :(得分:1)

是的!小菜一碟!

给出问题陈述,因为....可以做到这一点,而不传递任何东西到交换功能!它很简单: -

int first;
int second;


void swap()
{
   int temp = first;
   first = second;
   second = temp;
}

答案 5 :(得分:1)

他们没有说你必须只召唤一次swap

int swap(bool do_swap, int x = 0, int y = 0)
{
    static int x_;
    static int y_;
    if (do_swap) {
        x_ = y;
        y_ = x;
        return x_;
    }
    return y_;
}

int main()
{
    int x = 1;
    int y = 42;
    x = swap(true, x, y);
    y = swap(false);
}

答案 6 :(得分:1)

如果我们需要交换两个int16

的解决方案
uint32_t swap16(uint16_t x, uint16_t y)
{
    return (x << 16 | y);
}

int main(void)
{
    uint16_t x, y;
    uint32_t res;

    x = 1;
    y = 2;
    res = swap16(x, y);
    x = res & 0xffff;
    y = (res >> 16) & 0xffff;
}

答案 7 :(得分:1)

//不使用函数参数交换两个数字 //如有任何错误,请纠正我 //使用堆栈(堆栈用于存储局部变量)推送和弹出概念//这里

#include<stdio.h>
void fun_1();
void main()
{
    int a,b;
    a = 2;
    b = 3;
    printf("values of a & b before : %d %d ", a, b);
    fun_1();
    printf("values of a & b after : %d %d ", a, b);
}
void fun_1()
{
    int temp, *ptr;
    ptr = &temp;
    ptr--;
    temp = *ptr;
    ptr = ptr-1;
    ptr--;
    *ptr = temp;
}

答案 8 :(得分:1)

像在数组中一样使用数组,不需要用 & 或指针传递值

喜欢

#include<bits/stdc++.h>
using namespace std;

void swap(int  a[])
{
    int t=a[0];
    a[0]=a[1];
    a[1]=t;
}


int main()
{

int a[2];

cin>>a[0]>>a[1];

swap(a);

cout<<a[0]<< "  "<<a[1];
    
}

我没有使用任何指针

我什至没有使用 & 运算符

答案 9 :(得分:-1)

您可以使用包含两个数字的结构/类进行交换,但这有点傻。 你可以使用的是一个宏。 (也许是他们想要的答案?)

答案 10 :(得分:-2)

我不确定你原来的问题,但看起来你需要这样的东西:

num1 = num1 + num2;
num2 = num1 - num2;
num1 = num1 - num2;

答案 11 :(得分:-2)

这是一个古老的琐事问题。的挫折

他们问你是否知道XOR交换技巧。

http://en.wikipedia.org/wiki/XOR_swap_algorithm

这也暗示(对我而言)你被20年过时的人采访,或只是咒骂 - 删除。