使用指针交换对象

2024-04-01

我正在尝试为使用 void 指针交换对象的作业问题交换对象。我的函数的声明必须是:

void swap(void *a, void *b, size_t size);

我并不是在寻找如何执行此操作的确切代码,这样我就可以自己弄清楚,但我不确定我是否理解正确。我发现一个问题是这样做:

void *temp;
temp = a;
a = b;
b = temp;

只改变指针指向的内容。那是对的吗?如果它是正确的,为什么交换指针实际上不会改变 *a 和 *b 之间的内容。因为如果你的指针指向不同的东西,你不能取消引用它并且对象现在会不同吗?

同样,只需切换值即可:

void *temp;
*temp = *a;
*a = *b;
*b = *temp;

也不正确,我不确定为什么。因为在我看来,内容又被切换了。

交换对象是否意味着完全交换内存和指针所指向的值?

所以看来我必须使用 malloc 为我的交换分配足够的空间。如果我为一个对象分配足够的内存,假设它们大小相同,我真的看不出它与上面其他两种方法有什么不同。

void *temp = malloc(sizeof(pa));
// check for null pointer
temp = a;
// do something I'm not sure of since I don't quite get how allocating space is any 
// different than the two above methods???

Thanks!


交换指针不会改变指向的值。如果是这样,那就就像交换信封上的地址标签一样,让我进入你的房子,你进入我的房子。

你就快到了:

void swap(void *a, void *b, size_t size) {
  char temp[size]; // C99, use malloc otherwise
  // char serves as the type for "generic" byte arrays

  memcpy(temp, b,    size);
  memcpy(b,    a,    size);
  memcpy(a,    temp, size);
}

The memcpy http://google.com/search?q=man+memcpy函数复制内存,这是 C 中对象的定义。(在 C++ 中称为 POD 或普通 ol' data,以进行比较。)通过这种方式,memcpy 是您在不关心对象类型的情况下进行赋值的方式,您可以甚至将其他分配写为 memcpy :

int a = 42, b = 3, temp;

temp = b;
b    = a;
a    = temp;
// same as:
memcpy(&temp, &b,    sizeof a);
memcpy(&b,    &a,    sizeof a);
memcpy(&a,    &temp, sizeof a);

这正是上面函数的作用,因为当您不知道对象的类型时不能使用赋值,而 void 是代表“未知”的类型。 (当用作函数返回类型时,它也意味着“无”。)


出于好奇,另一个版本在常见情况下避免了 malloc 并且不使用 C99 的 VLA:

void swap(void *a, void *b, size_t size) {
  enum { threshold = 100 };
  if (size <= threshold) {
    char temp[threshold];

    memcpy(temp, b,    size);
    memcpy(b,    a,    size);
    memcpy(a,    temp, size);
  }
  else {
    void* temp = malloc(size);
    assert(temp); // better error checking desired in non-example code

    memcpy(temp, b,    size);
    memcpy(b,    a,    size);
    memcpy(a,    temp, size);

    free(temp);
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用指针交换对象 的相关文章

随机推荐

  • 使用 SocketServer 中的子进程调用停止主 Python 进程

    我正在尝试实现一种反向终端 在某台计算机 foo 上启动 server py 在其他计算机上运行 nc foo 2000 并且您将连接到 foo 上的 bash shell 我正在使用以下服务器代码 import socket os thr
  • 如何让 Mercurial 将“hg out --patch”差异显示为视觉差异?

    看起来像hg out patch or hg out p是查看哪些代码被推送到存储库 推送时 的好方法 但差异是文本格式的 有没有办法让它使用kdiff3还有 hg outgoing patch单独显示每个变更集中的更改 如果您正在寻找可视
  • 如何判断sidekiq是否连接到redis服务器?

    使用控制台 如何判断 sidekiq 是否连接到 Redis 服务器 我希望能够做这样的事情 if sidekiq is connected to redis psuedo code MrWorker perform async do wo
  • Python - Vincenty 反演公式不收敛(查找地球上点之间的距离)

    我正在尝试实现维基百科上描述的文森蒂逆问题HERE http en wikipedia org wiki Vincenty 27s formulae Inverse problem 问题在于 lambda 根本不收敛 如果我尝试迭代公式序列
  • Opera 控制台中出现红色警告消息

    出现红色消息 大概是在浏览器自动更新之后 Warning 该区域仅供开发人员使用 众所周知 骗子会鼓励人们在此处复制 粘贴信息来破解帐户 如果您不确定 请不要继续 浏览器是 Opera 87 0 4390 36 似乎它不适用于 Chrome
  • 为什么在使用带有类名的静态变量时未显示非法前向引用错误

    在下面的代码中 当使用类名访问静态变量时 它不会引发前向引用错误 但在没有类名的情况下访问它会引发前向引用错误 为什么使用类名访问时不会发生这种情况 class Test static System out println a shows
  • Azure 计算服务工作线程在扩展后变得“忙碌”

    我正在 Azure 中运行一项具有 4 个工作实例的服务 当我扩展到 5 个工作实例时 已启动的第一个实例进入 繁忙 状态 这是为什么 扩大规模期间会发生什么 azure 是否重新运行所有启动任务 我很困惑 似乎找不到任何有关此的文档 扩展
  • 获取 Node.js 中的完整文件路径

    我有一个将 csv 文件上传到特定文件夹 例如 上传 的应用程序 现在我想获取该 csv 文件的完整路径 例如 D MyNodeApp uploads Test csv 如何获取 Node js 中的文件位置 我使用 multer 上传文件
  • 使用 x64 SIMD 进行半字节改组

    我知道字节改组 https www felixcloutier com x86 pshufb指令 但我想对半字节 4 位值 做同样的事情 具体来说 我想在 64 位字中混洗 16 个半字节 我的洗牌索引也存储为 16 个半字节 最有效的实施
  • 从字符串创建数组

    我需要像这样创建数组 Array firstkey gt Array secondkey gt Array nkey gt 由此 firstkey secondkey nkey yourString firstkey secondkey n
  • 有没有一种简单的方法可以将 ISO 8601 持续时间转换为 timedelta?

    我怎样才能转换ISO 8601 持续时间字符串 https en wikipedia org wiki ISO 8601 Durations to datetime timedelta https docs python org 3 lib
  • 如何通过 Antd 和 VueJS 在表格单元格中使用 customRender

    我在我的应用程序中使用 antd 并尝试执行 customRender 以在单元格中显示图像 我的列数组如下所示 columns title Design dataIndex designImage fileUrl customRender
  • 如果 IP 位于 IP 范围之间,则限制该 IP

    好的 今天是星期五下午 我度过了漫长的一周 所以希望得到一些帮助 目前 我有一个 IP 范围列表 如下所示 List
  • Visual Studio 2019 - 在 WebApp 中添加 WebJob 项目

    在我的解决方案中 我有一个 aspnet core 2 2 WebApp 我想添加一个现有项目 例如 webJob 但没有选项 从现有项目添加 WebJobs 为什么 使用相同的过程 我在其他 Net 应用程序上添加 WebJobs 此选项
  • 互斥体和 Windows Phone 8.1

    这是我的问题 Windows Phone 8 1 Visual Studio 2013 版本 4 我有一个主项目和一个每 30 分钟运行一次的后台项目 我想在两者之间传递数据 我想确保对 Windows Storage Applicatio
  • 如何在 android layout.xml 文件中创建 2 行按钮

    我尝试在 android layout xml 文件中创建 2 行按钮 第一行左对齐 第二行居中对齐 这就是我所做的 但我最终得到了一排按钮 你能告诉我我做错了什么吗 enter code here
  • 查找“IN”子句中与记录不匹配的值

    我有一个dept表与eng and finance记录 它不包含以下记录foo bar or baz 我有一个休眠查询 它返回与我要查找的内容匹配的记录 看起来像 select from dept where dept name in en
  • 布局权重在 ScrollView 中不起作用

    我想将布局权重分配给一个中的多个项目LinearLayout里面的一个ScrollView 但是 那ScrollView忽略LinearLayout weightSum 我的目标是将布局划分为权重 2 1 1 总和为 4 但这在 a 内部无
  • 在 R 中访问多个艺术家的 Spotify API

    我在 Spotify 的开发者应用程序部分创建了客户端 ID 和密钥 我正在参考这份文件 并希望通过选择多名艺术家来扩展它 https www r bloggers com the eurovision 2016 song contest
  • 使用指针交换对象

    我正在尝试为使用 void 指针交换对象的作业问题交换对象 我的函数的声明必须是 void swap void a void b size t size 我并不是在寻找如何执行此操作的确切代码 这样我就可以自己弄清楚 但我不确定我是否理解正