2016-04-03 105 views
0

指針只能以不連續的步驟移動。計算地址:指針+非負數

int *p; 
p = malloc(sizeof(int)*8); 

因此,正式*(p + 2)計算爲*(p + 2 * sizeof(int))。

但是,如果我實際編碼上述兩個,我會得到不同的結果,這似乎是可以理解的。

*p = 123; 
*(p+2) = 456; 
printf("%d\n",*(p+2*(sizeof(int)))); \\0 
printf("%d\n",*(p+2)); \\456 

問題是,這個計算是否隱含,由編譯器在編譯時完成?

+2

*是否爲隱式計算,由編譯器在編譯時完成?*:是。究竟。 – haccks

+0

在數字系統中**每個**計算都是以不連續的步驟完成的。和「因此,形式上(p + 2)'計算爲'(p + 2 * sizeof(int))'」。是錯的。 '(p + 2)'計算爲'(int *)((char *)p + 2 * sizeof(int))''。失格是一個不同的操作。你可能想讀一本好的C書。 – Olaf

+0

該計算是隱式的,由編譯器完成。與以0,1,2,3(不用乘以sizeof(int))相同的方式索引int []數組的方式相同,這同樣適用於指針運算。 –

回答

3

問題是,這個計算是否隱含,由編譯器在 編譯時完成?

是的,這是隱含的,當你寫ptr+n它實際上向前推進了N次的字節數指針對象類型的大小(例如在int*情況下 - 這是4個字節授予整數需要你的計算機上有四個字節)。

例如

int *x = malloc(4 * sizeof(int)); // say x points at 0x1000 
x++; // x now points at 0x1004 if size of int is 4 

你可以閱讀更多指針算術。

1

因此,正式*(p+2)計算爲*(p+2*sizeof(int))

不,*(p+2)計算爲*(int*)((char*)p+2*sizeof(int))

即使簡短一看,只有sizeof(int) == 1