int (*p) 和 int *p 之间有区别吗?

Is there a difference between int (*p) and int *p?

本文关键字:int 有区别 之间      更新时间:2023-10-16

我刚刚了解了函数指针,要声明函数指针,您必须将*与指针名称放在括号中,以确保它不会返回int *

两者之间有区别吗

int *p

int (*p)

我尝试用cdecl查找这个,但到目前为止没有运气。 cdecl 说这是一回事,但没有提供解释。如果我声明

short (*p)

这是短指针还是短指针?p的大小是 2 字节还是 4 字节?我知道有人问过类似的问题,但到目前为止,我还没有运气。

两者之间会有区别吗

int *p

int (*p)

不。 这是编写同一类型的两种不同方式。 括号在这里并不神奇——它们只是用来覆盖优先级,就像算术运算符一样。

区别在于

int *p();

(声明返回int *的函数"p"(和

int (*p)();

(声明指向返回 int 的函数的指针(。 如果没有*p周围的括号,(空(参数列表与所声明的名称更紧密地关联。

如果我这样做了:

short (*p)
是短指针

,还是指向短指针的指针?p是 2 个字节还是 4 个字节?

类似于int (*p)它声明了一个指向short的指针。 指针的大小特定于实现,但 4 字节和 8 字节是常见的选择。 指向的数据应该是short的大小,这也是特定于实现的,但通常是 2。

近指针与远指针的概念是编译器供应商的特定概念(现在很少出现在一些奇怪的嵌入式系统之外;x86机器在移动到32位IIRC时放弃了它(。没有,也没有使用short(意味着比正常指针更小(声明的"短指针"的概念,因为 C 的short已经有了含义。short*是一个正常大小的指针,指向一个short大小的位置,仅此而已。

基本上,sometype (*p)并不意味着与sometype *p有任何不同。函数指针用 somereturntype (*p)(argument, types, go here) 声明;如果没有参数类型的括号,它根本不是函数指针。

#include <iostream>
using namespace std;
int main() {
    // your code goes here
    short (*p);
    short *r;
   printf("size - %u- %u",sizeof(p) , sizeof(r));
   return 0;
}

为两者返回 4。

short (*p)

那将是一个指向空头的指针。在大多数情况下,取消引用时为 2 个字节。在现代计算机上,指针大小可能是 4 或 8 个字节。

s = 5;
short *p = &s;

您在使用它的上下文中没有区别。

括号用于强制运算符优先级。 如果不需要括号,例如在初始化中,则 short *pshort (*p) 都是等效的(两者都是指向内存中short值的指针(。 指针的实际大小应该是统一的(并且大小与它们指向的数据成员不对应(,因为它们只是存储相关数据成员的地址。

如果您有指向对象的指针,则可能需要使用括号来强制优先级。 例如:

Object *myObject = new Object();
int myObjectSize = *myObject.size(); // INCORRECT: . operator has higher precedence than *
int myObjectSize = (*myObject).size(); // CORRECT: parentheses force precedence

当然,在这种特定情况下,myObject->size()更常用(以避免过度使用括号(。