【发布时间】:2016-02-28 12:05:36
【问题描述】:
我正在玩 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) 工作时达到 SEGMENTATION FAULT,因为一开始 *((int *) PNT_left)) = 左?
谢谢大家!
【问题讨论】:
-
使用说明符
%p打印地址。 -
搜索并阅读有关在 c 中模拟通过引用传递。
-
@JoachimPileborg 谢谢你......但是我已经指定我也在主函数中尝试过......