C中的指针:为什么x=&;当得到x的地址时?
假设我们有以下代码,它取C中的指针:为什么x=&;当得到x的地址时?,c,pointers,syntax,C,Pointers,Syntax,假设我们有以下代码,它取x,将值4存储在其中,然后将x的地址存储在指针变量中: int x = 4; int *address_of_x = &x; x的int*地址中的*的目的是什么? 我理解*用于取消指针引用-它接受地址并告诉您存储在那里的内容。但是,如果存储了地址,那么我们要取消引用什么呢?或者我们根本就没有去引用任何东西?为什么不写为: int address_of_x = &x; int address_of_x = &x; int addre
x
,将值4
存储在其中,然后将x
的地址存储在指针变量中:
int x = 4;
int *address_of_x = &x;
x的int*地址中的*
的目的是什么?
我理解*
用于取消指针引用-它接受地址并告诉您存储在那里的内容。但是,如果存储了地址,那么我们要取消引用什么呢?或者我们根本就没有去引用任何东西?为什么不写为:
int address_of_x = &x;
int address_of_x = &x;
int address_of_x = &x;
这是指针的定义,变量的address\u的类型是int*
,是指向int
的指针。那里没有“取消引用”
为什么不写为:
int address_of_x = &x;
int address_of_x = &x;
int address_of_x = &x;
嗯,有两件事
- C是一种强类型语言
- 变量名与其类型没有任何关联
在表达式中,*
是解引用运算符。在声明中(这里有),它是指针声明器语法的一部分。您正在声明address\u of_x
是指向int
的指针,而不仅仅是int
这种语法背后的思想是,为了方便起见,标识符的声明和用法应该类似(通常通过取消引用来使用指针)
还要注意的是,对于作为指针声明的每个标识符,都需要使用*
,即使您在一个声明中声明了多个标识符,如下所示:
int *a, *b;
如果你写信
int *a, b;
相反,b
将不是一个指针。一般来说,最好的做法是避免每个声明声明一个以上的标识符。int*address\u of_x=&x
声明一个类型为“指向int的指针”的变量(int*address\u of_x
),然后用地址x对其进行初始化(=&x
)
因此,此*
不是解引用,而是声明的一部分。这两个片段在功能上是相同的:
int *address_of_x = &x;
及
在第一种情况下,您在一条语句中定义并初始化了指针,但它看起来可能是错误的语法。在第二个示例中,定义和赋值是独立的语句,代码更清晰
还没有解引用。int*address\u of_x=&x代码>不是作业<代码>int*地址\u of_x=&x
是一个声明(int*address\u of_x
),带有初始化(=&x
)(请注意,在史前C中,初始化(相对于赋值)是在没有=
的情况下完成的,这使得它们与赋值更加不同)
C镜像使用中的声明int*address\u of_x
声明*address\u of_x
类型为int
,ergoaddress\u of_x
类型为指向int的指针。=&x
部分然后将指向int的指针初始化为&x
(地址为x
).简单回答:变量声明或定义语句中的星号不是解引用运算符。而是修饰符
在给定上下文中,星号表示“将mext标识符定义为指向基类型的指针”
您肯定不会问为什么[10]
并不意味着在int a[10]
中“获取数组的第10个元素”。嗯,一般。出于完全相同的原因,这里的括号也不是括号运算符
为什么不写为:
int address_of_x = &x;
int address_of_x = &x;
int address_of_x = &x;
编译器从不试图解释标识符的字面意义。它仅在确定声明语句中IDIdentifier的类型时查找修饰符
i、 例如,此代码不会像它看起来那样工作:
int *not_a_pointer, not_an_array[10];
float a_character;
*
在int*地址中代码>未取消引用。
它是类型声明的一部分:
同
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
为什么不写为:int address\u of_x=&x代码>
&x
不是int
&x
是一个int*
,一个指针(或地址)。指针不是整数。它不是解引用,而是类型。上下文很重要。*
在C语言中可能意味着很多不同的事情,具体取决于上下文。你的C编程书应该清楚地说明这一点。我有一种重复的感觉。显然,@DavidBowling的可能的重复是存在的,它是随着对类型本身的理解而来的。