初学者问题-为什么C使用*来声明指针而不是&;?

初学者问题-为什么C使用*来声明指针而不是&;?,c,cs50,C,Cs50,那么让我们说: int n = 50; int *p = &n; 为什么我们在C中使用*而不是&?*和&之间的主要区别是什么?在C*中,变量定义的意思是“指针指向”。在表达式中,&运算符表示“的地址”,而*运算符表示“取消引用” 因此,实际上: int n = 1; int* p = &n; // Create a pointer and initialize with the address of n if (*p == 1) { // This is true whe

那么让我们说:

int n = 50;
int *p = &n;

为什么我们在C中使用
*
而不是
&
*
&
之间的主要区别是什么?

在C
*
中,变量定义的意思是“指针指向”。在表达式中,
&
运算符表示“的地址”,而
*
运算符表示“取消引用”

因此,实际上:

int n = 1;
int* p = &n; // Create a pointer and initialize with the address of n

if (*p == 1) {
  // This is true when dereferencing the pointer
}
为什么不像在
int&p
中那样使用
&
?主要是因为语法不是这样设置的

值得注意的是,在C++中,<代码>和<代码>返回为“引用”:


注意,在右边不需要任何特殊处理,它只需要计算出来。

使用
*
声明指针基本上是惯例问题,但有一个一致性原因:声明
int*p
中的
*
表示
int
*p
的类型

p
被初始化为
n
的地址时,编写
int&p=&n
似乎更为一致,但这种约定不适用于双指针:
int**pp
pp
定义为指向
int
的指针,但
pp
不能用
&&n初始化


注意
int&p=n是C++中的一个有效的定义,用于引用<代码> int >代码>,这是一个伪装的指针。修改
p
将修改
n
。引用是作为指针实现的,没有间接表示法。

C声明遵循一种通常被称为“声明模仿使用”的约定。声明的结构与代码中表达式的结构匹配(尽可能接近)

例如,假设您有一个指向名为
p
int
的指针。为了访问存储在指向对象中的值,我们使用一元
*
运算符取消对指针的引用,如下所示:

printf( "value of what p points to is %d\n", *p );
表达式
*p
的类型为
int
,因此我们将
p
声明为

int *p;
这表示变量
p
的类型为“指针指向
int
”,因为声明符中
p
和解引用运算符
*
的组合会产生
int
类型的表达式

这就是为什么在C中不使用
&
操作符声明指针的主要原因,因为表达式
&p
的类型不是
int

C++使用一元
&
运算符声明引用,这与指针不同:

void foo( int &ref )
{
  ref = new_value(); // writes a new value to the actual parameter ref references
}

int main( void )
{
  int x = 1;
  std::cout << "x before foo = " << x << std::endl;
  foo( x );
  std::cout << "x after foo = " << x << std::endl;
  return 0;
}
这很重要-没有“指针指向”类型说明符。pointerness由声明器指定。如果你写的是

int* a, b;
它将被解析为

int (*a), b;

并且只有
a
将被声明为指针

“*”用于表示指针类型,因为这是语法。不需要其他理由。一元*运算符(与类型声明不同,无论是否使用相同的符号)是指针解引用,&一元运算符是address-of。为什么?因为语言语法是这样的,这就是为什么。你所展示的
p
声明(
int*p
)意味着
p是指向int
的指针,我把它读作“int pointer p”,而
int*p
中的
*
至少对我来说意味着“指针”。YMMV。@BobJarvis,莫妮卡:有趣的评论。我通常不会大声朗读代码,我可能会读int star p,或者在教授法国程序员intéTOLE p时。你的发音更合理,也不容易混淆。您将如何发音
char*argv[]
?我将其发音为“char(发音为‘care’-我的代码不会冒烟:-)指针数组argv”,或者可能是“char指针数组argv”。谢谢!这就是语法和惯例的问题?我在学习,所以我想确定…这就是C是如何被定义的。
int* a, b;
int (*a), b;