首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么解引用运算符(*)也用于声明指针?

为什么解引用运算符(*)也用于声明指针?
EN

Stack Overflow用户
提问于 2011-12-31 08:56:49
回答 5查看 7.2K关注 0票数 57

我不确定这是否是一个恰当的编程问题,但这是一直困扰我的问题,我想知道我是不是唯一的一个。

在最初学习C++时,我理解引用的概念,但指针让我感到困惑。你会问为什么?因为您声明指针的方式。

请考虑以下几点:

代码语言:javascript
复制
void foo(int* bar)
{
}


int main()
{
    int x = 5;
    int* y = NULL;

    y = &x;
    *y = 15;     
    foo(y);

}

函数foo(int*)接受一个int指针作为参数。因为我已经将y声明为int指针,所以我可以将y传递给foo,但在第一次学习C++时,我将*符号与取消引用关联起来,因此我认为需要传递一个取消引用的int。我会尝试将*y传递给foo,但这显然不起作用。

如果有一个单独的运算符来声明指针,不是更容易吗?(或用于取消引用)。例如:

代码语言:javascript
复制
void test(int@ x)
{
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-31 09:07:20

The Development of the C Language中,丹尼斯·里奇这样解释他的推理:

最明显地将C语言与其前身区分开来的第二个创新是这种更完整的类型结构,特别是它在声明语法中的表达式...给定任何类型的对象,应该可以描述一个新对象,该对象将多个对象集合到一个数组中,从函数中产生它,或者是指向它的指针……这导致了名称的声明语法反映了名称通常出现的表达式语法的声明语法。因此,

int i, *pi, **ppi;声明一个整数,一个指向整数的指针,一个指向整数的指针。这些声明的语法反映了这样一种观察:在表达式中使用时,i, *pi, and **ppi都会生成int类型。

类似地,int f(), *f(), (*f)();声明返回整数函数、返回指向整数的指针、指向返回整数的函数的指针。int *api[10], (*pai)[10];声明了一个指向整数的指针数组和一个指向整数数组的指针。

在所有这些情况下,变量的声明类似于其在类型为声明开头命名的表达式中的用法。

语法上的意外导致了这门语言的复杂性。间接操作符,在C中拼写为*,在语法上是一元前缀运算符,就像在BCPL和B中一样。这在简单的表达式中工作得很好,但在更复杂的情况下,需要使用括号来指导解析。例如,为了区分通过函数返回的值的间接性和调用由指针指定的函数,可以分别编写*fp() and (*pf)()。表达式中使用的样式继承到声明中,因此可以声明名称

int *fp(); int (*pf)();

在更华丽但仍然现实的情况下,情况会变得更糟:int *(*pfp)();是指向函数的指针,返回指向整数的指针。

有两种影响发生。最重要的是,C有一套相对丰富的描述类型的方法(比方说,与Pascal相比)。例如,像C-Algol 68这样表达能力很强的语言中的声明--描述同样难以理解的对象,只是因为对象本身很复杂。第二个效果归因于语法的细节。C中的声明必须以一种“内向外”的方式阅读,许多人发现这种风格很难掌握。Sethi Sethi 81观察到,如果将间接操作符作为后缀操作符而不是前缀操作符,则许多嵌套的声明和表达式将变得更简单,但到那时更改已为时已晚。

票数 86
EN

Stack Overflow用户

发布于 2011-12-31 08:59:39

如果你这样写,原因就更清楚了:

代码语言:javascript
复制
int x, *y;

也就是说,x和*y都是整数。因此y是一个int *。

票数 16
EN

Stack Overflow用户

发布于 2011-12-31 09:00:31

这是一个早于C++的语言决策,因为C++从C继承了它。我曾经听说,其动机是声明和使用是等价的,也就是说,给定一个声明int *p;表达式*pint类型,就像int i;表达式iint类型一样。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8685514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档