使用 void 的通用交换尝试**
Generic swap attempt using void**
我试图通过交换指针地址来交换任何给定类型的两个值。
我想出的函数在调用任意两个整数时工作正常,但当在同一范围内定义更多整数时(至少对我而言)表现得很奇怪。例如,考虑这个 SSCCE:
#include <stdio.h>
static inline void exchx(void** a, void** b) { void* p = *a; *a = *b; *b = p; }
int main(void) {
int a = 1;
int b = 2;
int c = 3;
int d = 4;
printf("\nBefore: abcd = %d, %d, %d, %d", a, b, c, d);
exchx((void**)&a,(void**)&b);
printf("\nAfter: abcd = %d, %d, %d, %d\n", a, b, c, d);
}
我希望第二个打印为“2、1、3、4”,但我得到的却是:
Before: abcd = 1, 2, 3, 4
After: abcd = 2, 1, 2, 4
我确信有很多更明智的方法来交换数据 - 这根本不是问题 - 我只是对这种行为感到好奇。有什么想法吗?
在你的代码中,这一行
exchx((void**)&a,(void**)&b);
将指向int的指针转换为指向void的指针。这只是意味着您的 int
被解释为 就好像它是 指针一样。预计这样做会出现任何奇怪的行为。
简而言之,您的 exchx
函数适用于交换实际的 指针 ... 不适用于其他任何东西。
我试图通过交换指针地址来交换任何给定类型的两个值。
我想出的函数在调用任意两个整数时工作正常,但当在同一范围内定义更多整数时(至少对我而言)表现得很奇怪。例如,考虑这个 SSCCE:
#include <stdio.h>
static inline void exchx(void** a, void** b) { void* p = *a; *a = *b; *b = p; }
int main(void) {
int a = 1;
int b = 2;
int c = 3;
int d = 4;
printf("\nBefore: abcd = %d, %d, %d, %d", a, b, c, d);
exchx((void**)&a,(void**)&b);
printf("\nAfter: abcd = %d, %d, %d, %d\n", a, b, c, d);
}
我希望第二个打印为“2、1、3、4”,但我得到的却是:
Before: abcd = 1, 2, 3, 4
After: abcd = 2, 1, 2, 4
我确信有很多更明智的方法来交换数据 - 这根本不是问题 - 我只是对这种行为感到好奇。有什么想法吗?
在你的代码中,这一行
exchx((void**)&a,(void**)&b);
将指向int的指针转换为指向void的指针。这只是意味着您的 int
被解释为 就好像它是 指针一样。预计这样做会出现任何奇怪的行为。
简而言之,您的 exchx
函数适用于交换实际的 指针 ... 不适用于其他任何东西。