*C指针中的符号

*C指针中的符号,c,pointers,syntax,C,Pointers,Syntax,这里,我提供了一个使用指针的简单代码 void rets(int *px, int *py) { *px = 3; *py = 5; } int main() { int x, y; rets(&x, &y); printf("First is %d, second is %d", x, y); } 我只是想把它弄清楚。。。在声明中:int*px,*py,留出两个字节用于存储整数变量的地址,并为该存储空间指定名称px。它还留出另外两个字

这里,我提供了一个使用指针的简单代码

void rets(int *px, int *py)
{
    *px = 3;
    *py = 5;
}
int main()
{
    int x, y;

    rets(&x, &y);
    printf("First is %d, second is %d", x, y);
}
我只是想把它弄清楚。。。在声明中:
int*px,*py
,留出两个字节用于存储整数变量的地址,并为该存储空间指定名称px。它还留出另外两个字节来存储另一个整数变量的地址,并为该空间命名为py。星号告诉编译器这些变量将包含地址,而不是(如果我没弄错的话?),int告诉编译器地址将指向整数变量。但是——这就是许多困惑的根源:

*px = 3;
*py = 5;

它在这里的使用方式与指针声明略有不同。这是什么意思?

所以在函数声明中,您声明了指向int的指针,这些指针将作为参数传递。在定义中,您正在取消引用指针,因此实际上使用main中声明的变量空间。如果您没有取消引用,那么您只是在更改指针,而不是指向的对象。在调用rets()的地方,使用&,给出main中定义的变量的地址

*px = 3;
*py = 5;

这意味着您将值
3
赋给指针所指向的内存
px
,并将值
5
赋给指针所指向的内存
py

基本上,“*”在C中有3种不同的用法(除非我遗漏了什么),具体取决于上下文

  • 倍增
  • 声明指针变量
  • 解引用
  • 让我们忽略1

    当你有类似

    TYPE * x;
    
    这声明了一个变量x,该变量包含指向类型为的值的指针

    而当你有

    *x
    

    当x是指针时,它指的是x所指向的对象,称为解引用(因为指针也被称为引用)

    void
    放入
    main()
    ,其优点是什么?无,应为int以及argc和argv的两个参数。这只是为了澄清问题而进行的一次快速编辑。您的意思是:函数已间接地将值3和5传递给变量x和y?@aerohn您已将地址赋予函数x和y,这允许函数通过访问地址(取消引用)来更改x和y的值。在C语言中,函数获取参数的副本。如果你想要一个函数来改变变量,你就给它一个指向该变量的指针。为什么投票要结束?这是一个完全合理的问题。