arr
不是您可以更改的普通變量。它不是一個指針 - 它的類型是int[2]
。
試試這個代碼:
#include <stdio.h>
void
increment_ptr(void **_ptr, int size){
*_ptr = (char *)(*_ptr) + size;
}
int
main(int argc, char **argv){
int arr[] = {11,20};
int* arr1 = arr;
printf("arr is %p\n", (void*)arr);
printf("arr1 is %p\n", (void*)arr1);
printf("arr gives %d\n", arr[0]);
printf("arr1 gives %d\n", arr1[0]);
increment_ptr((void **)&arr, sizeof(int));
increment_ptr((void **)&arr1, sizeof(int));
printf("arr is %p\n", (void*)arr);
printf("arr1 is %p\n", (void*)arr1);
printf("arr gives %d\n", arr[0]);
printf("arr1 gives %d\n", arr1[0]);
return 0;
}
可能的輸出:
arr is 0xfff1d1b8
arr1 is 0xfff1d1b8
arr gives 11
arr1 gives 11
arr is 0xfff1d1b8 // Notice arr isn't changed
arr1 is 0xfff1d1bc // arr1 works as expected
arr gives 15
arr1 gives 20
換句話說:你不能提前這樣一個數組的基址
您可能還會發現這代碼有趣:
#include <stdio.h>
int main(int argc, char **argv){
int arr[2] = {11,20};
printf("arr is %p\n", (void*)arr);
printf("arr is %p\n", (void*)&arr);
return 0;
}
可能的輸出:
arr is 0061FED8
&arr is 0061FED8
注意如何打印arr
爲指針給出了相同的打印&arr
那麼,在你的代碼的情況是,數11
(又名ARR [0])讀作指針(鑄造到char *),然後添加4
(因此您有15
),它將覆蓋當前的11
。注意:這個結果表明指針和int
s在你的系統上都是4個字節。
第二個printf應該打印數組的第二個元素爲20. –
您期望'increment_ptr'以某種方式更改'arr';你能更直接地檢查嗎? –
我明白,它可以直接完成,我已經粘貼了我想要在我的項目中做的簡化版本。所以,請讓它這樣.. –