为了清楚事实,我想问一下
int i = 1;
int *p = &i;
i = *p;
你在p上叫做运营商*?被称为解除引用运算符与第3行相同?
答案 0 :(得分:6)
这是指针声明的一个例子:
int *p = &i;
这是解除引用运算符的示例:
i = *p;
运算符仅适用于变量,而不适用于类型,它们不是同一个东西。
答案 1 :(得分:4)
*
不是运算符,它是声明符。应用于类型时,它会将其转换为指向该类型的指针。
您可以将int*
视为一种类型。
用这种方式写它会更清楚:
int i = 1;
int* p = &i;
i = *p;
答案 2 :(得分:2)
int i = 1;
int *p = &i;
*
是声明语法的一部分。 int *p
表示p
的类型为int*
。
i = *p;
*
是解除引用运算符。
但两者使用相同语法的事实并非巧合。 C(看似奇怪的)声明语法主要基于“声明遵循使用”的原则。
阅读声明的一种方法
int *p;
是声明*p
的类型为int
。由此得出p
属于int*
类型。类似地:
int *a, b, c[20];
表示*a
,b
和c[blah]
都是int类型,因此a
的类型为int*
,b
为类型为int
,c
属于int[20]
类型。 (请注意,声明和用法之间的对应关系并不完美; c[20]
刚好超过数组的末尾,并且实际上并不存在。)
这就是为什么(至少在一个思想流派中)指针声明中的*
位于标识符旁边,而不是类型。
答案 3 :(得分:1)
这是指针声明,而不是取消引用运算符。
我想强调一下我们使用时的星号(*) 声明一个指针只意味着它是一个指针(它是它的一部分 类型化合物说明符),不应与之混淆 我们之前看过的解引用运算符,但是 也用星号(*)写。他们只是两个不同 用相同符号表示的东西。
答案 4 :(得分:0)
以这种方式定义指针
int *p = &i;
有些令人困惑。我建议你使用它(注意空格)
int* p = &i;
但是以这种方式定义多个指针时会出现问题:
int* p = &i, * q = NULL;
更清楚的是,首先定义指针类型,然后使用该类型定义变量:
typedef int* int_ptr;
int_ptr p = &i, q = NULL;