Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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指针-为什么使用*而不使用&;_C_Pointers_Value Of_Indirection - Fatal编程技术网

声明C指针-为什么使用*而不使用&;

声明C指针-为什么使用*而不使用&;,c,pointers,value-of,indirection,C,Pointers,Value Of,Indirection,我的问题很简单(我希望是关于指针声明的c语法)。我完全了解如何声明指针,如何使用它,以及效果如何,如下所示 int *val_ptr; int val =99; val_ptr = &val; 然而,让我困惑的是,为什么在C中声明指针时使用*间接(value of)运算符?而不是操作员的地址(&A)。如果我们声明一个指针,那么使用&这样做是否有意义,因为我们声明的地址是正确的?例如: int & val_ptr; int val =99; val_ptr = &va

我的问题很简单(我希望是关于指针声明的c语法)。我完全了解如何声明指针,如何使用它,以及效果如何,如下所示

int *val_ptr;
int val =99;

val_ptr = &val;
然而,让我困惑的是,为什么在C中声明指针时使用*间接(value of)运算符?而不是操作员的地址(&A)。如果我们声明一个指针,那么使用&这样做是否有意义,因为我们声明的地址是正确的?例如:

int & val_ptr;
int val =99;

val_ptr = &val;
我知道这是不正确的,但在我看来,这似乎更直观。在我对*运算符的概念中,我遗漏了什么。我还没有找到一本教科书能给我解释为什么,它们只是说明如何。我知道怎么做,我想知道为什么


感谢阅读。

指针声明语法试图模仿指针的用法。当你有

int *ptr;

然后,
*ptr
是int类型。

您不能使用
&
运算符在C中声明指针。标准不允许这样做。在C中声明指针时,如:

int *val_ptr;  
然后声明中的
*
不是解引用(间接)运算符。但是当这个
*
出现在语句中时,它将执行间接寻址。

当您编写:

int *mypointer;
您可以这样想,“我声明(*mypointer)是一个int”(即,“我的指针将引用一个int”),如下所示:

int (*mypointer);
看现在,

int (&mypointer);

毫无意义。你在说什么?“我的指针值的地址是int”(这是真的,但不是你的意思)。

声明模仿使用。如果您有一个指向整数的指针,并且希望访问指向的值,则可以使用
*
运算符取消对指针的引用,如下所示:

x = *p;
表达式
*p
的类型为
int
;因此,
p
的声明应该是

int *p;

“为什么?”只有一个正确答案:因为标准这么说。这不是一个问题吗?这个问题似乎离题了,因为它属于程序员。stackexchange。com@AndrewS你似乎在要求我们深入研究里奇等人的思想。除了“创造者认为是这样”之外,我们无法给你一个明确的答案@安德鲁斯:在我看来,这个问题无法用StackOverflow的标准来回答,但这本身并不是一个坏问题——只是不适合这个网站(程序员。stackexchange会更好)。你不应该被否决,但这是互联网。人们会做任何事。我知道,我在我的作品中提到了这一点。但为什么这是标准,这似乎违反直觉。我确信这是一个概念上的原因,我只是想看看是否有人知道。你能解释一下为什么
1
被解读为
One
而不是
Apple
?这背后有什么我不知道的原因吗?@AndrewS我认为牛顿定律和C定律的区别在于后者完全是由人类设计的。这意味着他们可以做任何他们想做的事,而不受任何自然法则逻辑的指导。因此,问为什么这样做可能毫无意义。人类创造的另一个例子:为什么加法的数学运算符看起来像“+”而减法看起来像“-”?为什么反之亦然?这背后有什么逻辑吗?@AndrewS你会惊讶地发现,计算历史有多少纯属巧合,或者只是从某个前身那里继承下来的。这里的答案是(正如Wojtek在这里回答的那样),这是因为,
int*j
表达式
*j
产生一个int,该设计在某种程度上被记录下来。请注意,您的问题是以非常主观的方式表述的,没有人知道或关心为什么使用
*
会让您感到困惑。这一个问题最能解决我的问题,它澄清了我的一些误解,即当用于声明变量时,它实际上不是间接运算符,而只是表示类型是指针。在得到否定的回答后,A实际上在retro computing论坛上提出了这个问题,并得到了一个完全清晰的简短答案,这是一个真正理解语言实现的人给出的。