7

我试图更好地理解 C 中的指针和引用,我的课程提供了以下程序作为示例。

#include <stdio.h>

void swap(int* a, int* b);

int main(void)
{
    int x = 1;
    int y = 2;

    swap(&x, &y);
    printf("x is %i\n", x);
    printf("y is %i\n", y);
}

void swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

我将以下内容混为一谈,看看它是否能帮助我更好地理解正在发生的事情,主要是关于使用 & 与 *(取消引用)的需要。基本上,声明指向 int 类型的指针 (int* a) 与使用星号“取消引用” (*a = *b) 的语法对我来说相当混乱,我希望有人能启发我。这是上面的另一个版本,我认为可以帮助澄清,但实际上并没有:

#include <stdio.h>

void swap(int* a, int* b);

int main(void)
{
    int x = 1;
    int y = 2;
    int *a = &x;
    int *b = &y;

    swap(a, b);
    printf("x is %i\n", x);
    printf("y is %i\n", y);
}

void swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

简而言之,我的问题是,这两个程序在做什么之间是否存在功能差异?*a = *b取消引用 ( ) 与使用&运算符 ( )之间有什么区别*a = &x”。

4

4 回答 4

6

You're confusing declaration and assignment.

*a = *bis called assignment. Notice it does not include a type name.

int *a = &x on the other hand is called declaration. Notice that you initialize the pointer with the address of x. You are not dereferencing the pointer, but are declaring it as a pointer to int.

Look at this:

int main() {
  int a = 5;
  int b = 2;
  int *c = &a; // c when dereferenced equals 5; **Declaration**
  int *d = &b; // d when dereferenced equals 2; **Declaration**
  int tmp = *c; // tmp equals 5
  *c = *d; // c when dereferenced now equals 2 **Assignment**
  *d = tmp; // d when dereferenced now equals 5 **Assignment**
  return 0;
}

Finally, when you declare and initialize a pointer in the same statement, you assign the pointer the address of what you want to have point at it. When you want to change the value the object points to, you dereference it using *. On the other hand, if you want to change what it points to, you do not dereference it.

于 2015-08-11T18:32:27.373 回答
5

&x返回 x 的地址。x 是整数类型,并且a是指向整数的指针类型。在这种情况下,(*a = &x),您将 x 的地址分配给“指向整数的指针”类型的变量,即a. (*a = *b) 是两个相同类型的整数变量之间的赋值操作。我之所以说整数,是因为即使ab是“指向整数的指针”,在该操作中它们也会被取消引用,因此它们所指向的整数值会被读取。

我认为您的困惑是因为 (*a = &x) 仅在指针初始化期间才有意义。

于 2015-08-11T18:44:31.903 回答
1

如果设置*a = *bsinceab是指针变量,则*运算符将检索内存中指向它的单元格的,并将其放入指向它的单元格。ba

对于*a = &x, & 运算符找到分配给变量的单元格的地址x,并将其放入 a 指向它的单元格中。

于 2015-08-11T18:44:14.620 回答
-1

简而言之,我的问题是,这两个程序在做什么之间是否存在功能差异?

不,功能效果完全一样。在

int *a = &x;
int *b = &y;

swap(a, b); 
// swap(&a, &b) 

的类型与a的相同&a,即int*(指向 的指针int)。唯一的区别是您使用其他变量来存储它,这在逻辑上并不是真正需要的,但拥有它绝对没问题,特别是如果它可以帮助您理解语法。

取消引用 (*a = *b) 与使用 & (*a = &x) 有什么区别。

*a = *b在 所指向的值中分配 所指向的b(用 获得*ba。为了看得更清楚,

int tmp = *b;
*a = tmp;

&(*a = &x)不是一个有效的表达式,因为你不能将地址存储到一个int(实际上你可以,但这已经超出了重点)。

于 2015-08-11T18:50:14.633 回答