酷!學園

技術討論區 => 程式討論版 => C/C++程式設計討論區 => 主題作者是: jojoson2005 於 2011-02-06 08:19

主題: C 指標問題
作者: jojoson20052011-02-06 08:19
代碼: [選擇]
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int a[] = {4, 0, 2, -5};
    int *t;

    t = &a + sizeof(int);
    printf("t = %d\n", *t);
    
    system("pause");
    return 0;
}

出來時"t = 0"

但是我加入了
代碼: [選擇]
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int i;
    int a[] = {4, 0, 2, -5};
    int *t;
    
    printf("element\t|address\t|value\n");
    printf("----------------------------\n");
    
    for(i = 0; i < (sizeof(a) / sizeof(int)); i++) {
          printf("a[%d]\t|%p\t|%d\n", i, &a[i], a[i]);
    }
    t = &a + sizeof(int);
    printf("t = %p\n", t);
    
    system("pause");
    return 0;
}

&a[0] = 0022FF20
那 t 應該要等於 0022FF24 吧?
可是為甚麼上面跑出來沒問題
下面卻變成 0022FF60 呢?
主題: 回覆: C 指標問題
作者: kenduest2011-02-06 09:25
考慮改成...

代碼: [選擇]
t = &a[0] + sizeof(int);
或者:

代碼: [選擇]
t = a + sizeof(int);


主題: 回覆: C 指標問題
作者: jojoson20052011-02-06 10:12
代碼: [選擇]
t = a + sizeof(int);
代碼: [選擇]
t = &a[0] + sizeof(int);都變成 0022FF30
代碼: [選擇]
printf("t = %p, t = %d\n", t, *t);取值(*t)的時候,不論哪一個 t = 148... 是我打錯還是= =
不是應該要是 t = 0 嗎?
為什麼?

另外 謝謝 kenduest 的回覆
主題: 回覆: C 指標問題
作者: kenduest2011-02-06 10:45
不好意思,我已經看不懂最後你要問的問題重點了呢...

首先再次強調你的語法是有問題的。

代碼: [選擇]
t = &a + sizeof(int);
a 本身單純表示就是該陣列的記憶體位址,或者是你使用 &a[0] 也可以,因為 a[0] 的記憶體位址就是 a 本身的記憶體位址。

所以 &a 又要加東西,這樣寫不知道要表示啥內容,編譯會告訴你有警告。

代碼: [選擇]
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int a[] = {4, 0, 2, -5,-1,-2,-3};
    int *t;

    t = &a + sizeof(int);
    printf("t = %d\n", *t);

    t = a + sizeof(int);
    printf("t = %d\n", *t);

}

執行輸出:

代碼: [選擇]
t = -1078797752
t = -1

或者是你應該把程式碼改成這樣就好:

代碼: [選擇]
t = (int *) &a + sizeof(int);
型別處理上就不會有問題。
主題: 回覆: C 指標問題
作者: twu22011-02-06 11:00
因為你對指標的運算認知有錯.

指標+1 的運算, 與指標所指到的東西有關.
對一個 char 的指標 p 而言, 若 p = 0 的話,  p+1 = 1
對一個 int (32 位元) 的指標 p 而言, 若 p = 0 的話,  p+1 = 4

你的例子中, a 是一個有 4 個 int (32 位元, 4 bytes) 的陣列, 大小是 4 * 4 = 16 (0x10).
所以, 如果 a 是 0 的話, a+1 就會是 16 (0x10).

因此你的 a+4 就等於實際上加了 64 (0x40)... 就是你執行的結果.
主題: 回覆:C 指標問題
作者: jojoson20052011-02-06 13:15
我知道了

謝謝 twu2 和 kenduest
主題: 回覆: C 指標問題
作者: 喵喵咩咩2011-02-11 18:11
其實你也可以 printf("%d\n", sizeof(int)); 會更了解指標 t 指去哪了
主題: 回覆: C 指標問題
作者: 平衡2011-02-18 14:38
謝謝 twu2 讓我對於指標有更深的認識了