2017-07-02 232 views
-6

我正在阅读的教科书解释说,指针是保存另一个变量起始地址的变量,而且它们是用指向的数据类型定义的。为什么你可以指定一个指针作为变量的地址呢?或者,如果省略“&”,而不是地址,如果这是指针的定义方式,它是否总是保存地址?C:指针=变量和指针=变量有什么区别?

+0

为什么要使用C++标记为一个C的问题? – 2017-07-02 15:44:58

+0

我以为这两个使用非常相似的语法,并建议。 :/ – Pixel

+0

您需要阅读[好书](https://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list) –

回答

0

ptr是实际的指针,而*ptr是无论它指向什么,所以*ptr=&var没有任何意义,除非它是一个指针的指针。它要么是ptr=&var要么是*ptr=var

如果你真的想给一个指针指定一个变量,那么可以通过强制转换。这编译,但我看不出有什么好理由做这样的事情:

#include <stdio.h> 
main() 
{ 
    int var=4; 
    int *ptr; 
    ptr = (int *)var; 
    printf("%d\n", *ptr); 
} 

行为是未定义的。当我跑它时,它隔断了。

+0

谢谢,如果是的话为什么指针变量可以赋值给变量呢?你可以使用'ptr = variable1'而不是'ptr =&variable1',这是否会使指针的行为与其他任何已命名的变量一样? – Pixel

+0

@像素:因为C把编码理智的东西放在程序员身上。仍然任何体面的编译器会发出警告(在大多数情况下)。 – alk

+0

非常感谢,我正在使用的教科书已经使用了这两个,真的把我扔了。 – Pixel

0

C是很久以前设计的,一些设计选择是在不再流行的情况下进行的。当函数原型是可选的,并且模糊性不能从上下文中解析出来时,运算符的地址需要将对象的地址而不是其值传递给函数。为了一致性,使用相同的语法进行赋值。

然而要注意你提出的语法简化,可以不再区分这些情况:

void *p; 
void *q = &p; // make q point to the pointer p 
void *q = p; // set q to the value of p 

还有其他潜在的语法简化:

  • .->运营商为对象,指针引用可以合并成一个运营商。

  • *语法间接函数调用:(*fun)()是reduncdant作为fun()是完全等价的。(请注意,您可以编写(****fun)()太)

+0

所以'void * ptr = variable'语法的用途是仅用于在指针之间传递地址的东西? – Pixel

+0

'void * ptr = variable;'相当于'void * ptr;'后面跟着'ptr = variable;'。它用于初始化void指针'ptr'的值和'variable'的值。 – chqrlie