作者 主題: C 指標問題  (閱讀 5680 次)

0 會員 與 1 訪客 正在閱讀本文。

jojoson2005

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
C 指標問題
« 於: 2011-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 呢?
« 上次編輯: 2011-02-17 15:10 由 jojoson2005 »

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: C 指標問題
« 回覆 #1 於: 2011-02-06 09:25 »
考慮改成...

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

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


I am kenduest - 小州

my website: http://kenduest.sayya.org/

jojoson2005

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
回覆: C 指標問題
« 回覆 #2 於: 2011-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 的回覆
« 上次編輯: 2011-02-06 10:13 由 jojoson2005 »

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: C 指標問題
« 回覆 #3 於: 2011-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);
型別處理上就不會有問題。
I am kenduest - 小州

my website: http://kenduest.sayya.org/

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5394
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
回覆: C 指標問題
« 回覆 #4 於: 2011-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)... 就是你執行的結果.

jojoson2005

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
回覆:C 指標問題
« 回覆 #5 於: 2011-02-06 13:15 »
我知道了

謝謝 twu2 和 kenduest

喵喵咩咩

  • 可愛的小學生
  • *
  • 文章數: 13
    • 檢視個人資料
回覆: C 指標問題
« 回覆 #6 於: 2011-02-11 18:11 »
其實你也可以 printf("%d\n", sizeof(int)); 會更了解指標 t 指去哪了

平衡

  • 活潑的大學生
  • ***
  • 文章數: 213
    • 檢視個人資料
回覆: C 指標問題
« 回覆 #7 於: 2011-02-18 14:38 »
謝謝 twu2 讓我對於指標有更深的認識了