2017-07-02 233 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