Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的指针:为什么x=&;当得到x的地址时?_C_Pointers_Syntax - Fatal编程技术网

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
,ergo
address\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的可能的重复是存在的,它是随着对类型本身的理解而来的。