2012-03-16 70 views
4

我在下面提到了三個不同的例子。我不明白爲什麼ex1有相同的ex2輸出和ex3不同的輸出,爲什麼ex2與ex3不一樣,我只是在另一行創建一個!C中的基本指針?

EX1

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    int x=2; 
    int *y; 
    y = &x; 
    printf("value: %d\n", *y); 
    printf("address: %d\n", y); 
    return EXIT_SUCCESS; 
} 

輸出

value: 2 
address: 2686744 

EX2

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    int x=2; 
    int *y = &x; 
    printf("value: %d\n", *y); 
    printf("address: %d\n", y); 
    return EXIT_SUCCESS; 
} 

OU tput的

value: 2 
address: 2686744 

EX3

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    int x=2; 
    int *y; 
    *y = &x; 
    printf("value: %d\n", *y); 
    printf("address: %d\n", y); 
    return EXIT_SUCCESS; 
} 

輸出

value: 2686744 
address: 2130567168 

我有指針的很大的誤解當我想到STAR必須用(Y)BECOME NOT(INT) 我想出了這個星星(int )NOT(Y)(^_^) 現在一切都清楚我...感謝所有的答案

+4

見L值和R值調高你的編譯器警告級別,你應該被告知有關問題... – 2012-03-16 16:55:22

+3

EX3是無效的。如果'y'從未設置,則不能帶'* y'。 – asveikau 2012-03-16 16:56:43

+1

你也應該習慣在打印指針時使用'%p',而不是'%d'。 (但仍然使用'%d'作爲整數類型,例如'* y'。) – asveikau 2012-03-16 16:58:30

回答

5

在示例3中,你首先聲明指針:

int *y; 

,然後你說的*yint值是x地址。

這是因爲與聲​​明int *y您有:

  • y的類型是int *
  • *yint型的。

所以,代碼示例3的行權應該是:

int *y; 
y = &x; 
+0

感謝您的回答。所以我必須給出x的y地址,但是如果我不這樣做的話,編譯器會給y賦予一個隨機值。我的解釋是否正確? – thalsharif 2012-03-16 17:19:59

+0

不,它不是一個隨機值。用'* y =&x'表示你得到'x'的地址的整數表示。當我打印y時,出現在0123時, – 2012-03-16 17:30:48

+0

。爲什麼我得到這個值2130567168?這個價值代表什麼? – thalsharif 2012-03-16 17:38:15

1

由於第三個例子說的*y =代替y =

+0

感謝您的回答。 – thalsharif 2012-03-16 17:26:40

1
*y 

是用於瞭解通過y

+0

感謝您的回答。 – thalsharif 2012-03-16 17:28:14

2

嗯指出的ADRESS的內容,讓我們將一切在一行中:

int *y 
ex1: y = &x 
ex2: y = &x 
ex3: (*y) = &x 

Ex3 is與其他兩個不同。

Ex3將值(& x)賦值給指針y指向的值。

+0

感謝您的回答。所以如果我寫「int * y =&x;」那是y的平均值是x的地址。那是對的嗎 ? – thalsharif 2012-03-16 17:25:44

+0

@thalsharif:基本上是的,但只有當y是'int **'類型時纔有效,y確實指向了某個東西(它沒有) – datenwolf 2012-03-16 17:40:55

1

int *y; *y = &x;不同於int *y = &x;。在前者中,您正在設置y指向的內存位置的內容,其地址爲x。而在後者中,您正在將指針y初始化爲地址x。因此,如果您從*y = &x中刪除*,您將看到與ex1 & ex2相同的輸出。

+0

感謝您的回答 – thalsharif 2012-03-16 17:44:59

1

在ex3上,*y = &x;表示您將在y指向的內存塊中存儲地址x。這是一個問題,因爲y實際上並沒有指向任何東西。

無論printf("address: %d\n", y);打印,都不會成爲有用的信息。

+0

感謝您的回答 – thalsharif 2012-03-16 17:45:36

1

在聲明類型時,*表示「指針」。之後,它是一個解除引用操作符。考慮:

int x=2; 
int *y; 
y=&x; 
*y = x; 

這是適當的,只要地址被分配地址,值的值。但是,解引用運算符會給出內容,所以* y = x不會超出範圍。你應該把它當作臨時對待。這就是爲什麼如果將* y傳遞給函數並對其進行修改,則在打印* y時不會看到修改。你必須通過y,即「通過參考」。總之,& * y = & x是不穩定的,並且不等於y = &x。在C.