我正在尝试使用指针交换两个整数的值,请参阅下面的代码:使用c中的指针交换数字:
{
int a = 10;
int b = 20;
swapr(&a, &b);
printf("a=%d\n", a);
printf("b=%d\n", b);
return 0;
}
void swapr(int *x, int *y) //function
{
int t;
t=*x;
*x=*y;
*y=t;
}
在代码中,当swap(&A, &B);
和*x
指向的值不是地址时,为什么会使用*y
答案 0 :(得分:6)
当您说(int *x, int *y)
时,您只是声明x
和y
为指针。在以后的所有用法中,当您说x
时,它表示指针,当您说*x
时,它表示它指向的值。
答案 1 :(得分:3)
在声明中,声明符中的*
表示该对象具有指针类型。接受声明
int *p;
p
的类型是“指向int
的指针”。此类型由类型说明符int
和声明符 *p
的组合指定。
Pointer-ness,array-ness和function-ness都被指定为声明符的一部分:
T *p; // p is a pointer to T
T a[N]; // a is an N-element array of T
T f(); // f is a function returning T
T *ap[N]; // ap is an array of pointers to T
T (*pa)[N]; // pa is a pointer to an array of T
T *fp(); // fp is a function returning pointer to T
T (*pf)(); // pf is a pointer to a function returning T
等。
在C中,声明模仿使用 - 如果你有一个指向名为int
的{{1}}并且你想要访问它指向的值的指针,你可以用p
运算符取消引用它,像这样:
*
表达式 x = *p;
的类型为*p
,因此int
的声明是
p
在int *p;
中,表达式main
和&a
的类型为&b
,因此相应的参数必须声明为int *
。
int *
答案 2 :(得分:1)
基本上,var声明的工作方式是声明变量
int c;
您刚刚声明了一个整数,您可以为其指定值或检索其值,如下所示
int a;
int b;
a = 10; // assign 10
b = a; //assign value of a to b
指针虽然有点不同。如果您声明了一个指针,并且想要为其指定一个值,则必须使用*运算符取消引用它
int * a; // declare a pointer
int b; // declare a var
b = 10; // assign 10 to b
*a = b; // assign 10 as the value of a
b = 20; // b is now 20 but the var a remains 10
但你也可以指定指向内存地址的指针
int * a;
int b;
b = 10; // assign 10 to b
a = &b; // assign address of b to a (a points at b)
b = 20; // value of b changes (thus value of a is also 20 since it is pointing at b
所以,如果你有一个功能签名
int func (int * a, int * b);
这一切都意味着该函数采用两个变量的地址
int a;
int b;
int * x;
int * y;
func(&a, &b); // send it the address of a and b
func(x, y); // send it the address of x and y
func(x, &b);
基本上可以使用& amp ;;访问正常的var地址。操作