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

时间:2015-09-29 03:38:24

标签: c++ pointers

我刚刚学习了函数指针,并且要声明一个函数指针,你必须将*放在带有指针名称的括号中,以确保它不会返回int *

之间有区别吗?
int *p

int (*p)

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

short (*p)

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

5 个答案:

答案 0 :(得分:7)

  

之间会有区别吗?
int *p
     

int (*p)

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

区别在于

int *p();

(声明函数“p”返回int *)和

int (*p)();

(声明指向返回int的函数的指针。如果没有*p左右的括号,(空)参数列表会与声明的名称紧密关联。

  

如果我这样做了:

short (*p)
     

会是一个短指针,还是一个短指针?并且p是2个字节,还是4?

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

答案 1 :(得分:3)

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

基本上,sometype (*p)sometype *p没有任何不同。函数指针用somereturntype (*p)(argument, types, go here)声明;没有参数类型的parens,它根本不是函数指针。

答案 2 :(得分:1)

#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。

答案 3 :(得分:1)

short (*p)

那将是指向短片的指针。在大多数情况下,当它被取消引用时,它是2个字节。在现代机器上,指针大小可能是4或8个字节。

s = 5;
short *p = &s;

答案 4 :(得分:1)

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

括号用于强制运算符优先级。如果不需要括号,例如在初始化中,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()更常用(避免过度使用括号)。