【问题标题】:C - Passing pointer as an argument to a swap functionC - 将指针作为参数传递给交换函数
【发布时间】:2020-12-18 13:41:40
【问题描述】:
#include<stdio.h>
 
void swap (char *x, char *y)
{
    char *t = x;
    x = y;
    y = t;
}
 
int main()
{
    char *x = "geeksquiz";
    char *y = "geeksforgeeks";
    char *t;
    swap(x, y);
    printf("(%s, %s)", x, y);
    t = x;
    x = y;
    y = t;
    printf("n(%s, %s)", x, y);
    return 0;
}

我希望原始指针会交换,但即使我将指针传递给函数,情况也并非如此,原因是它产生了本地指针? 如何使用函数交换原始指针?

【问题讨论】:

  • 内部swapxy是局部变量。因此,实际上,该功能在宏伟的计划中是无操作的。
  • 同时查看this 帖子和this 帖子。
  • 另外,请避免将文字字符串分配给char*。如果需要修改它,请考虑分配给const char*,或者将其声明为数组。

标签: c pointers


【解决方案1】:

它的原因是它使本地指针?

是的。 xyt 都是局部变量,xy 是原始指针的副本

如何使用函数交换原始指针?

交换指针可能没有任何意义,但如果你出于某种原因需要这样做,那么:

void swap (char** x, char** y)
{
  char* t = *x;
  *x = *y;
  *y = t;
}

【讨论】:

    【解决方案2】:

    如果你想交换指针,你需要传递对它们的引用(指向指针的指针)

    void swap (char **x, char **y)
    {
        char *t = *x;
        *x = *y;
        *y = t;
    }
    

    用法:

    swap(&x, &y);
    

    或者你可以定义宏:

    #define  SWAP(x,y,type) do {type t; t = (x); (x) = (y); (y) = t; } while(0)
    

    用法:

    SWAP(x,y, char *);
    

    #define  SWAP(x,y) do {const void * t; t = (const void *)(x); (x) = (y); (y) = t; } while(0)
    

    用法:

    SWAP(x,y);
    

    【讨论】:

    • (void *)(x) 我会放弃这个演员表。假设指针是合格的,或者如果调用者传递一个整数而不是一个指针 - 你将隐藏编译器错误。
    • (编辑后)现在您遇到了将const void* 分配给非限定指针的问题 :) 所有这些都表明宏是多么脆弱 - 使宏类型安全并涵盖所有用途-cases,我们必须做很多其他的宏观技巧。
    • @Lundin 然后是第一个版本
    • 用 2 个参数编写安全的宏类型实际上是一个有趣的编程挑战。我想不出任何顺利的方法。
    • 其实这可能是很好定义的:uintptr_t t; memcpy(&amp;t, &amp;(x), sizeof(x)); (x) = (y); memcpy(&amp;(y), &amp;t), sizeof(y));
    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2019-08-17
    • 1970-01-01
    • 2015-03-17
    • 2012-01-24
    相关资源
    最近更新 更多