以指针作为函数参数的语法解释(C++)
Syntax explanation with pointers as function parameters (C++)
我不确定我是否能在这里问一些基本问题,但我开始学习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我需要它吗?我认为两个函数的语法应该相同,但事实并非如此。有人能解释一下原因吗?
星号*
和与号&
的含义根据上下文而变化。它们在表达和声明中的含义不同:
- 在声明中使用
*
时,它会指定一个指针 - 在声明中使用
&
时,它会指定引用 - 在表达式中使用
*
时,它对其操作数执行指针解引用 - 在表达式中使用
&
时,它将获得其操作数的指针
一旦你了解了这些区别,你就可以看出
int *ab
行是一个声明。星号将ab
指定为指针- 行
ab = &a;
具有表达式。&
获取a
的指针,并将其分配给ab
,后者在声明时指定了指针类型(如上( - 行
*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的这篇文章可能对你有很大帮助:
指针的基本规则是什么?
相关文章:
- 解释通过 lex/flex 实现 C/C++嵌套的"#include "Header""语法?
- 有人可以解释以下语法及其功能吗?
- 解释通过从函数引用返回数组的语法
- 你能解释一下这个语法吗:ros::rate loop_rate(10);
- 解释奇怪的 c++ 编译和语法
- 有人可以根据此代码解释起床和降低语法
- C++类构造函数语法的解释
- hpp文件中的块,这是c ++语法吗?为什么没有传入参数?有人可以解释一下,请
- 有人能解释一下特殊的std::函数模板参数列表语法(这个奇怪的类型(Types..))吗
- 引用变量何时合适,为什么?你能解释一下实际的语法和位置吗?
- 有人可以解释这种语法吗?T (&arr)[arrsize] vs T& arr[arrsize]
- 你能解释一下这个C++函数定义的语法吗?
- 难道没有人一劳永逸地解释typedef的语法吗?
- Visual Studio 中无法解释的语法错误
- 有人能解释一下这个模板函数声明的语法吗
- Matlab语法[C++解释]
- 有人能解释一下这个语法吗
- C++语法解释
- 任何人都可以解释boost元组库的语法
- 有人能解释一下这个冒号#语法吗