为什么 Dereference 运算符用于声明指针?
Why is the Dereference operator used to declare pointers?
为什么*
用来声明指针?
它删除了间接寻址,但是当你声明一个像int *a = &b
这样的指针时不删除任何间接寻址,它不应该删除&b
的间接寻址吗?
任何时候你有一个像这样初始化的指针声明:
type *x = expr;
相当于先单独初始化再赋值:
type *x;
x = expr;
不等同于
type *x;
*x = expr; /* WRONG */
C 和 C++ 中的许多符号被重载。也就是说,它们的含义取决于使用它们的上下文。例如,符号 &
可以表示寻址运算符和二进制按位与运算符。
声明中使用的符号*
表示一个指针:
int b = 10;
int *a = &b,
但用在表达式中,当应用于指针类型的变量时,表示解引用运算符,例如:
printf( "%d\n", *a );
也可以表示乘法运算符,比如可以这样写:
printf( "%d\n", b ** a );
与
相同
printf( "%d\n", b * *a );
同样,一对方括号可以用在数组的声明中,如:
int a[10];
并作为下标运算符:
a[5] = 5;
它是声明的一部分,所以它根本不是解引用运算符。但它仍然意味着同样的事情。
int *a
可以读作
The value pointed by a
is an int
.
就像
printf("%d\n", *a);
可以读作
Print the value pointed by a
.
请参阅 this answer 到 在 C/C++ 中声明指针变量的正确方法,了解一些背景知识。
当 C 被发明时,做出了一个有点有趣的选择。变量将以一种对它们将如何使用的回声来声明。
所以
int a;
的意思是“你可以从a
中得到一个int
。然后,
int *a;
意味着你可以从 *a
中得到一个 int
。
而且,
int a[3];
意味着你可以从a[index]
中得到一个int
;在这里,大小放在索引所在的位置。
这可以链接到复杂的案例
int *a[3];
对
int (*a)[3];
现在,如果您不知道 C 语言的解析是如何工作的,那么这是不透明的;但至少你只需要学习一次!
这就是为什么有些人认为 int* a
是错误形式的原因,因为 *
确实附加到 a
而不是 int
。
命名变量的初始化是另一回事。
(some declaration) = (some expression)
声明中的符号从不充当表达式。它们是相同的符号,只是含义不同。
为什么*
用来声明指针?
它删除了间接寻址,但是当你声明一个像int *a = &b
这样的指针时不删除任何间接寻址,它不应该删除&b
的间接寻址吗?
任何时候你有一个像这样初始化的指针声明:
type *x = expr;
相当于先单独初始化再赋值:
type *x;
x = expr;
不等同于
type *x;
*x = expr; /* WRONG */
C 和 C++ 中的许多符号被重载。也就是说,它们的含义取决于使用它们的上下文。例如,符号 &
可以表示寻址运算符和二进制按位与运算符。
声明中使用的符号*
表示一个指针:
int b = 10;
int *a = &b,
但用在表达式中,当应用于指针类型的变量时,表示解引用运算符,例如:
printf( "%d\n", *a );
也可以表示乘法运算符,比如可以这样写:
printf( "%d\n", b ** a );
与
相同printf( "%d\n", b * *a );
同样,一对方括号可以用在数组的声明中,如:
int a[10];
并作为下标运算符:
a[5] = 5;
它是声明的一部分,所以它根本不是解引用运算符。但它仍然意味着同样的事情。
int *a
可以读作
The value pointed by
a
is anint
.
就像
printf("%d\n", *a);
可以读作
Print the value pointed by
a
.
请参阅 this answer 到 在 C/C++ 中声明指针变量的正确方法,了解一些背景知识。
当 C 被发明时,做出了一个有点有趣的选择。变量将以一种对它们将如何使用的回声来声明。
所以
int a;
的意思是“你可以从a
中得到一个int
。然后,
int *a;
意味着你可以从 *a
中得到一个 int
。
而且,
int a[3];
意味着你可以从a[index]
中得到一个int
;在这里,大小放在索引所在的位置。
这可以链接到复杂的案例
int *a[3];
对
int (*a)[3];
现在,如果您不知道 C 语言的解析是如何工作的,那么这是不透明的;但至少你只需要学习一次!
这就是为什么有些人认为 int* a
是错误形式的原因,因为 *
确实附加到 a
而不是 int
。
命名变量的初始化是另一回事。
(some declaration) = (some expression)
声明中的符号从不充当表达式。它们是相同的符号,只是含义不同。