我刚刚学习了函数指针,并且要声明一个函数指针,你必须将*
放在带有指针名称的括号中,以确保它不会返回int *
。
之间有区别吗?
int *p
和
int (*p)
我尝试用cdecl查找,但到目前为止没有运气。 cdecl说这是一回事,但没有提供解释。如果我宣布
short (*p)
那是短指针还是短指针? p
的大小是2字节还是4?我知道有类似的问题,但到目前为止我还没有运气。
答案 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 *p
和short (*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()
更常用(避免过度使用括号)。