以指针作为函数参数的语法解释(C++)

Syntax explanation with pointers as function parameters (C++)

本文关键字:解释 语法 C++ 参数 指针 函数      更新时间:2023-10-16

我不确定我是否能在这里问一些基本问题,但我开始学习C++,对指针语法一点都不理解。

这是我的代码示例:

using namespace std;
int randomname(int *x);
int main(){
    int a = 1;
    int *ab;
    ab = &a;
    randomname(&a);
}

int randomname(int *x){
    *x = 9001;
}

我的问题是关于*符号。为什么在主函数的第行ab=&a我不需要*,但在线*x=9001我需要它吗?我认为两个函数的语法应该相同,但事实并非如此。有人能解释一下原因吗?

星号*和与号&的含义根据上下文而变化。它们在表达和声明中的含义不同:

  • 声明中使用*时,它会指定一个指针
  • 声明中使用&时,它会指定引用
  • 表达式中使用*时,它对其操作数执行指针解引用
  • 表达式中使用&时,它将获得其操作数的指针

一旦你了解了这些区别,你就可以看出

  1. int *ab行是一个声明。星号将ab指定为指针
  2. ab = &a;具有表达式&获取a的指针,并将其分配给ab,后者在声明时指定了指针类型(如上(
  3. *x = 9001也是表达式,使星号成为解引用运算符。使用星号告诉编译器,赋值的目标是x所指向的对象,而不是x本身

在声明指针或取消引用指针时需要星号。这两个函数的语法实际上是相同的,但每个赋值语句中分配的内容不同。

int是一个值。int变量存储在存储位置中。指向int的指针也是一个值,但它的值指的是存储位置。当你用指针执行赋值时,你可以赋值指针本身的值(它所指的存储位置的地址(,也可以赋值给它所指存储位置。

如果函数的形式参数中存在int *x,或者在定义ab变量的声明int *ab中,则需要星号,因为您声明的变量或参数类型为"pointer to int"。

在分配ab = &a中,您不需要星号,因为您将变量a地址分配给指针ab--您分配的是指针本身的值,而不是它指向的值。

在赋值*x = 9001中,您需要星号来获取指针所指的存储位置。这称为"取消引用"指针。您不是为指针本身赋值,而是为指针引用的存储位置赋值,该存储位置是为函数main中的变量a分配的存储。

Eric Lippert的这篇文章可能对你有很大帮助:

指针的基本规则是什么?