int *address_of_x = &x;中的*未取消引用@尤金Sh。 它是类型声明的一部分:pointer to int。
int x = 4;
int *address_of_x = &x;
字符串 相同
int x = 4; // declare x as int
int *address_of_x; // declare address_of_x as pointer to int
address_of_x = &x; // Assign the address of x to address_of_x
8条答案
按热度按时间ulydmbyx1#
int *address_of_x = &x;
中的*
未取消引用@尤金Sh。它是类型声明的一部分:pointer to int。
字符串
相同
型
为什么不写为:
int address_of_x = &x;
&x
不是int
。&x
是int *
,指针(或地址)。指针不是整数。gupuwyp22#
在 expression 中,
*
是解引用操作符。在 declaration 中,它是 pointer declarator 语法的一部分。您将address_of_x
声明为指向int
* 的 * 指针,而不仅仅是int
。这种语法背后的想法是,为了方便起见,声明和标识符的使用应该看起来相似(通常通过解引用来使用指针)。
还要注意,每个声明为指针的标识符都需要
*
,即使你在一个声明中声明了多个标识符,像这样:字符串
如果你写
型
相反,
b
将不是指针。不过,一般来说,最好避免在每个声明中声明多个标识符。k5hmc34c3#
int *address_of_x = &x;
不是赋值。int *address_of_x = &x;
是一个声明(int *address_of_x
),带有initialization(= &x
)(注意,在史前的C中,初始化(与赋值相对)是在没有=
的情况下完成的,这使得它们与赋值更加不同)。在C镜像用法中的声明。
int *address_of_x
声明*address_of_x
的类型为int
,因此address_of_x
的类型为 * 指向int* 的指针。然后= &x
部分将此指向int* 的 * 指针转换为&x
(x
的地址)。o3imoua44#
这是指针的定义,
address_of_x
变量的类型是int *
,一个指向int
的指针。这里没有“解引用”发生。为什么不写成:
字符串
两件事
mec1mxoz5#
简单回答:**在变量声明或定义语句中的星号不是解引用操作符。**相反,它是一个修饰符。
在给定的上下文中,星号表示“将mext标识符定义为指向基类型的指针”。
你肯定不会问为什么
[10]
在int a[10]
中的意思不是“取数组的第10个元素”。嗯,一般吧。这里的括号也不是括号运算符,原因完全相同。为什么不写成:
字符串
编译器 * 从不 * 尝试解释标识符的字面意思。它只在声明语句中确定标识符的类型时查找修饰符。
也就是说,这段代码不会像它看起来那样工作:
型
8fsztsew6#
int *address_of_x = &x;
* 声明 * 一个类型为“指向int的指针”的变量(int *address_of_x
),然后用x(= &x
)的地址 * 替换 * 它。所以这个
*
不是解引用,而是声明的一部分。cld4siwp7#
这两个代码段在功能上是相同的:
字符串
和
型
在第一个例子中,你在一个语句中定义和初始化指针,但它可能看起来像是错误的语法。在第二个例子中,定义和赋值是独立的语句,代码更清晰。
还没有解引用。
aamkag618#
读作-
int x = 4; int* address_of_x = &x;
1.你创建了一个int类型的变量x,并在其中存储了一个值4。
1.你创建了一个int* 类型的变量address_of_x,即指向一个int值的指针,并在其中存储了x的地址。
注意:指针不仅仅是一个地址,它是一个指向pointerType类型的变量的地址。
字符串
你可以通过https://www.youtube.com/watch?v=zuegQmMdy8M,宇宙中最好的指针教程:)