在这里完成C newb。试图通过弄乱简单的代码片段来学习/理解指针。
#include <stdio.h>
void swap(int *px, int *py)
{
int tmp;
tmp = *px;
*px = *py;
*py = tmp;
}
main()
{
int *a, *b;
*a = 1;
*b = 2;
swap(&a,&b);
printf("%d %d\n", *a, *b);
}
为什么这不起作用?从main中删除解除引用运算符*
时,代码有效。
从概念上讲,这似乎应该有效。我将a
和b
初始化为指针,分别指向int 1
和int 2
。然后我将他们的地址发送到swap()
,这应该切换他们指向的地址。
答案 0 :(得分:11)
有几个问题。首先,指针a
和b
未指向有效内存。因此,未定义整数值的赋值(可能崩溃)。其次,调用swap(假设a和b指向有效内存)不应该包含地址(它当前正在发送指针变量的地址)。
以下更改将使其有效:
int a, b;
a = 1;
b = 2;
swap(&a,&b);
printf("%d %d\n", a, b);
答案 1 :(得分:6)
swap()
函数没问题,但在main中您正在获取指针的地址,因此您将int**
个参数传递给int*
个参数。< / p>
int *a, *b;
swap(&a,&b);
要解决此问题,请将main()
中的代码替换为:
int a = 1, b = 2;
swap(&a,&b);
printf("%d %d\n", a, b);
答案 2 :(得分:4)
指针指向数据。指针本身不包含用于存储的存储器,它仅指向现有存储器。因此,当您声明int *a;
时,您只有一个没有可用值的垃圾指针,并且您不能取消引用它。
使用指针的唯一合理方法是为它们分配某些地址(或某些分配函数的结果):
int i;
int *a = &i; // now a points to i
因此,使用交换函数的正确方法是传递整数地址:
int i = 10;
int j = -2;
swap(&i, &j);
答案 3 :(得分:2)
a
和b
是未初始化的指针,取消引用它们会导致未定义的行为。你想要:
int main() {
int a, b;
a = 1;
b = 2;
swap(&a,&b);
printf("%d %d\n", a, b);
return 0;
}
答案 4 :(得分:0)
您的方法签名错误。你要求两个指向int的指针,但你传递两个指向int的指针。
答案 5 :(得分:0)
当你说,“然后我将他们的地址发送到swap(),这应该切换他们指向的地址。”您是否尝试更改main中指针变量中的地址值,以切换它们指向的内存位?在这种情况下,您将需要另一个重定向步骤:
#include <stdio.h>
void swap(int **px, int **py) {
int *tmp;
tmp = *px;
*px = *py;
*py = tmp;
}
int main (void) {
int x, y; /* storage to point to */
int *a, *b;
a = &x;
b = &y;
*a = 1;
*b = 2;
printf("(*a, *b, x, y) == (%d, %d, %d, %d)\n", *a, *b, x, y);
swap(&a, &b);
printf("(*a, *b, x, y) == (%d, %d, %d, %d)\n", *a, *b, x, y);
}
$ ./a.out
(*a, *b, x, y) == (1, 2, 1, 2)
(*a, *b, x, y) == (2, 1, 1, 2)
x
&amp; y
值未发生变化,但a
指向x
,现在指向y
,反之亦然b
。