2013-09-23 47 views
0

在以下代碼片段中,指針地址和值的引用類型爲size_t。然而正如標題所說,最後的減法對我來說沒有意義。它的作用就好像它減去乘以8的數字而不是實際值,如int array所示。爲什麼從一個地址中減去一個指針值會導致指針值的8倍差距?

#include <stdio.h> 
#include <stdint.h> 

int main() 
{ 
    int i[6] = {2, 0, 1, 0, 20, 24}; 

    void *ptr = &i[2]; 

    printf("%zu\n", ((size_t*)ptr)); 
    printf("%zu\n", *((size_t*)ptr)); 
    printf("%zu\n", ((size_t*)ptr) - *((size_t*)ptr)); 
} 
+0

什麼類型的說明符是'%zu'?給我的編譯器發出警告:'未知的格式轉換類型字符'z'。 – haccks

+0

@haccks這是'size_t'的正確轉換說明符。 – 2013-09-23 16:29:37

+0

@haccks'z'是整數格式的修飾符,指示整型參數的期望類型是'size_t'。恕我直言,這是不正確的使用在這裏。 (C11 7.21.6.1 7) – chux

回答

3

首先要注意的是,您正在通過指向無符號整數變量的指針訪問帶符號整數變量。另請注意,sizeof(size_t)可能不一定等於sizeof(int)

線:

printf("%zu\n", ((size_t*)ptr) - *((size_t*)ptr)); 

有效是否AddressOf(i[2]) - i[2],這是AddressOf(i[2]) - 1

在C指針算術中,地址不是1遞減,而是由1 * sizeof(data type)遞減,這就是您的計算機上的sizeof(size_t)。如果你在64位機器上,這可能是8個字節。這你得到的地址將是-8,而不是像我想你期待,-1 ...

編輯:%z大概可能是%p指針地址。不需要投到size_t *,並且可能如上所述是危險的...

+0

太好了,我不知道它是用sizeof(數據類型)乘以值。非常感謝! – martinjlowm

+1

請不要**回答明顯重複的問題。改爲關閉投票。 – 2013-09-23 16:30:32

0

您正在從size_t指針中減去i[2] == 1,因此實際差異爲sizeof(size_t) == 8

相關問題