2012-06-11 106 views
-2

任何人都可以請完整解釋下面的代碼嗎?指針前/後增量

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

int main() 
{ 
    int *a, *s, i; 

    a = s = (int *) malloc(4 * sizeof(int)); 

    for (i = 0; i < 4; i++) 
    { 
     *(a + i) = i * 10; 
     printf(" %d ", *(a + i)); 
    } 

    printf("\n"); 
    printf("%d\n", *s++); 
    printf("%d\n", (*s)++); 
    printf("%d\n", *s); 
    printf("%d\n", *++s); 
    printf("%d\n", ++*s); 
    printf("\n"); 
    printf("%d\n", *a++); 
    printf("%d\n", (*a)++); 
    printf("%d\n", *a); 
    printf("%d\n", *++a); 
    printf("%d\n", ++*a); 

    return 0; 
} 

輸出:

0 10 20 30 
0 
10 
11 
20 
21 

0 
11 
12 
21 
22 

1)如何指針 'S' 正在打印值,其中僅*(a+i)被分配在 的值循環?

2)當*(a+i)被分配時,該值在哪裏準確存儲?

3)*s++,(*s)++,*++s,++*s有什麼區別?

4)爲什麼值增加1時,我打印指針類似於s?

在此先感謝! :)

+1

需要'家庭作業'標籤嗎? –

+1

請在詢問之前搜索網站。基本上同樣的問題已經有很多問題了。 –

+0

這些都是重要的問題,不應該被拒之門外 –

回答

0

1)

變量as都指向同一個內存位置。

2)

如果你說a + 1,可以通過它的類型的大小1次遞增指針a的值(1×4)。所以,如果你說*(a+1),你從下一個整數取值。你可以把你的變量看作一個數組,因爲它指向一個大小爲4個整數的內存位置。您也可以像這樣訪問這些值:a[0], a[1], a[2] and a[3]

3)

*s++:您採取指針的值和該聲明之後,指針s由4.

`(* S)遞增++「:你取的值然後將該值增加1.

*++s:您將指針s增加4,然後取其值。

++*s:你帶指針s的價值,並通過1

4)

增加它由於指針s和指針a都指向同一個內存位置,並調用*s++中, 內存位置的值增加1。

2

1和2)指針指向(或者你可以說它是某個地址的)某個內存位置。由於您分配了a = s = (int*) malloc(4 * sizeof(int));,as都具有相同的地址,或指向相同的內存位置。如果在存儲器位置(例如,存儲器位置)處有任何改變到內容。在您的代碼中,您將數字分配給分配的內存),那麼只要您擁有正確的地址(as都指向相同的位置),您可以看到內容的更改。

一個粗略的比喻是,你問房子(malloc),它會給你回房子的地址(a)。然後你決定房子很醜,並且你想重畫它(分配值:*(a + i) = i + 10),你告訴地址(s)的其他人會看到你的房子已經被重新粉刷過。

3)

*s++指在當前地址訪問內容,並後來遞增指針(地址)。

反射回你的代碼,它訪問第一個元素,然後地址將指向第二個元素。

(*s)++指在當前地址訪問內容,並後來遞增在當前地址內容

反思回你的代碼,它會在增加它之前獲取第二個元素的內容。下一個打印語句顯示第二個元素的內容已經增加。

*++s表示遞增當前地址,並訪問內容遞增地址。

反思回你的代碼,它得到第三個元素的內容。

++*s意味着增量在當前地址內容,並訪問遞增內容。

反思回你的代碼,它會得到第三個元素遞增的內容。

4) 正如前面部分所述,如果您通過一個指針修改內容,您將看到它,如果你有相同的指針(地址)。實際上,您正在修改內存地址的內容(如3所述),因此在重複此過程時可能會看到修改的效果。

0
a=s= (int *) malloc(4*sizeof(int)); 

這種說法分配內存以「S」 ANS相同的內存被分配到「A」 例如我西港島線的故事分配的地址是2000通常這將是十六進制只是爲了瞭解我將採取十進制值。 爲(I = 0;我< 4;我++)

{ 

    *(a+i)=i*10; 

printf(" %d ",*(a+i)); 

    } 
的地址被添加以i

當u做(A + I)....一個+ 0 = 2000(根據實施例) 一個+ 1 = 2004(下一個存儲位置),因爲一個被INT指針它將由4(INT的大小)

  +--------+---------+----------+---------+ 
     |0  | 10 |  20 | 30 | 
     |  |   |   |   | 
     +--------+---------+----------+---------+ 
Address 2000  2004  2008  2012 

*(A + I)WIL遞增給你的內存位置的內容只有(a + i)或者給你的地址 ,因爲如果你將s分配給兩者都具有相同的值 那麼現在* s ++現在s是2000 * s是0並且s ++發生在下一個使用S的將是在2004年的位置,以便其0 下一回合* s爲10(* S)++ WIL後遞增10所以它的11下次使用

看到的優先級和結合到知道它是如何編譯

http://msdn.microsoft.com/en-us/library/126fe14k%28v=vs.80%29.aspx