2015-02-09 123 views
0

如果我運行OS X以下幾點:C:爲什麼指針和指針有不同的值?

int main (void) 
{ 
    int* n; // initialise(declare) pointer 
    *n = 20; // the value in address pointed to by n is 20 
    printf("n: %i, n&: %i\n", n, &n); 
    return 0; 
} 

我得到:

N:1592302 ,正&:1592302和

爲什麼不同的價值觀?

+0

你爲什麼期望他們是一樣的?你認爲'&'的作用是什麼? – 2015-02-09 20:47:04

回答

2

在你的代碼

 int* n; //initialization is not done 
    *n = 20; 

調用未定義的行爲。你試圖去引用(寫入)未初始化的內存。在解除引用之前,您必須分配內存到n

除了形成部分,

  • nint *
  • &n將類型int **

所以,他們不同,應該有不同的值。

也就是說,您應該使用%p格式指定符與printf()來打印指針。

4

爲什麼pointer&pointer有不同的值?

表達&n產生的n本身的地址,而n計算結果爲值指針的,即它指向事物的地址。

但請注意,您有未定義的行爲首先,因爲您正在取消引用未初始化的指針。您需要將n指向您可以寫信的地方。

例如,

int* n; 
int i = 42; 
n = &i; 

// now you can de-reference n 
*n = 20; 

其次,你打錯printf說明符&n。您需要%p

printf("n: %i, &n: %p\n", n, &n); 
+0

我認爲他進一步使用不正確的說明符&n – 2015-02-09 20:56:22

+0

@gio良好的捕獲。編輯。 – juanchopanza 2015-02-09 21:00:26

2

int* n聲明瞭一個名爲n變量,它是指向一個整數。
&n返回變量n的地址,該變量將是指向整型指針的指針。

比方說,我們有下面的代碼:

int a = 20; // declare an integer a whose value 20 
int* n = &a; // declare a pointer n whose value is the address of a 
int** p = &n; // declare a pointer p whose value is the address of n 

在這種情況下,我們有以下幾點:

variable name | value | address in memory 
     a  |  20  | 1592302512 
     n  | 1592302512 | 1592302480 
     p  | 1592302480 | who knows? 
0

只是作爲一種替代,讓我拼了這一點,以不同的方式。

char *ptr; 
char c='A'; 
ptr = &c; 

在這段代碼,這裏發生了什麼,當我們以不同的方式晉級ptr什麼值被發現。

ptr本身包含char c變量所在的內存中的地址。 *ptr取消引用指針,返回變量c的實際值。在這種情況下,大寫A. &ptr將給出ptr表示的內存位置的地址。換句話說,如果你需要知道指針本身的位置,而不是它指向的地址是什麼,這就是你如何得到它。