gpt4 book ai didi

C 指针 - 交换

转载 作者:行者123 更新时间:2023-11-30 20:01:04 25 4
gpt4 key购买 nike

我正在用 C 语言玩指针...我尝试编写一个接收指向值的指针、检索指针的指针并交换指向值的指针的交换,而不是接收指向值的指针和交换值的常规交换。

这是代码...


互换功能:

void swap(void *left, void *right)
{
puts("\nswap function:\n\n");

printf("&left : %i - left: %i - *left(should be a): %i\n",
&left, left, *((int *)left));
printf("&right : %i - right: %i - *right(should be b): %i\n\n",
&right, right, *((int *)right));

void *PNT_left = (void *) &left;
void *PNT_right = (void *) &right;

puts("Before swap:");
printf("PNT_left: %i - left: %i\n", (int *)PNT_left, *((int *)PNT_left));
printf("PNT_right: %i - right: %i\n\n", (int *)PNT_right, *((int *)PNT_right));

/* swap pointers of pointers*/
void *tmpPNT = PNT_left;
PNT_left = PNT_right;
PNT_right = tmpPNT;

puts("Pointer of pointer swapped:");
printf("PNT_left: %i - left: %i\n", (int *)PNT_left, *((int *)PNT_left));
printf("PNT_right: %i - right: %i\n\n", (int *)PNT_right, *((int *)PNT_right));

/* swap pointers*/
tmpPNT = (void *)right;
*((int *)PNT_left) = (int *)left;
*((int *)PNT_right) = (int *)tmpPNT;

puts("Pointer swapped:");
printf("PNT_left: %i - left: %i\n", (int *)PNT_left, *((int *)PNT_left));
printf("PNT_right: %i - right: %i\n\n", (int *)PNT_right, *((int *)PNT_right));

puts("Info:");
printf("&left : %i - left: %i - *left: %i\n",
&left, left, *((int *)left));
printf("&right : %i - right: %i - *right: %i\n\n",
&right, right, *((int *)right));

puts("End Swap function.\n\n\n");
return;
}


主要:

int main()
{
int a = 1, b = 2;

puts("Before - Info:");
printf(" a: %i - b: %i\n", a, b);
printf("*a: %i - *b: %i\n\n", &a, &b);

swap(&a, &b);

puts("After - Info:");
printf("*a: %i - *b: %i\n", &a, &b);
printf(" a: %i - b: %i\n", a, b);
return 0;
}


输出:

Before - Info:
a: 1 - b: 2
*a: -346930776 - *b: -346930772


Swap function:

&left : -346930760 - left: -346930776 - *left(should be a): 1
&right : -346930752 - right: -346930772 - *right(should be b): 2

Before swap:
PNT_left: -346930760 - left: -346930776
PNT_right: -346930752 - right: -346930772

Pointer of pointer swapped:
PNT_left: -346930752 - left: -346930772
PNT_right: -346930760 - right: -346930776

Pointer swapped:
PNT_left: -346930752 - left: -346930776
PNT_right: -346930760 - right: -346930772

Info:
&left : -346930760 - left: -346930772 - *left: 2
&right : -346930752 - right: -346930776 - *right: 1

End Swap function.


*a: -346930776 - *b: -346930772
a: 1 - b: 2


为什么a和b没有交换?我也在 main 中尝试过,所以它与通过 ref 或 value 传递无关。


为什么如果我尝试打印 *((int *) *((int *)PNT_left)) 程序会达到段错误,而打印 *((int) left) 有效,因为从一开始 *((int *) PNT_left)) = 向左?


谢谢大家!

最佳答案

void *PNT_left =  (void *) &left;
void *PNT_right = (void *) &right;

您获取局部变量的地址,就像 C 中指针按值传递一样。如果您想更改函数中的指针并保持此更改在函数外部可见,则必须传递指针的地址。

Here您可以发现您的代码已更正。

您应该将其添加到第 33 行

/* swap values*/
int tmp = *((int*)(*left));
*((int *)(*left)) = *((int *)(*right));
*((int *)(*right)) = tmp;

您是否也希望交换数据。

关于C 指针 - 交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35682299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com