作者 : 卿笃軍
你有沒有想過,對一個一維數組名取地址,然後用這個地址進行加減運算。這會出現什麼樣的結果呢?
示例:
int a[5] = {1,2,3,4,5};
int *p = (int *)(&a+1);
printf("%d\n",*(p-1));
這個輸出會是多少呢?
咦?為什麼第二行需要強制轉化類型呢?
答:a是一個一維數組的名字,&a相當於一個指向一維數組的指針。怎麼感覺這麼熟悉?指向數組的指針,那不就是行指針嗎?int (*p)[]。
行指針+1,就是對指針進行加減操作,其結果還是一個行指針~~~原來如此,需要強制轉換為單指針。
那麼,輸出結果是多少呢?
答:當然是5。
為什麼?
答:上面不是說了嘛,&a就是一個行指針,那就是指向一行的指針咯。行指針+1,不就指向下一行了,這裡一行為[5]個,那麼int *p = (int *)(&a+1)就要在a的基礎上偏離5個位置:(如下:上一行表示偏離位數,下一行表示a[]中對應的數據)
0 1 2 3 4 5
1 2 3 4 5 *
咦,這不是越界了嗎?移動五位都跑出a[]數組處於' * '號位置了。哦,我看到printf()輸出了。你輸出的是*(p-1),這裡p是一個單指針-1就是往左位移一位就行了,那不就是又回到5的位置了嗎?原來是這樣,輸出結果是5 。
下面我們用一段代碼來顯示位移情況~~~
#includeint main() { int a[5] = {1,2,3,4,5}; int *p = (int *)(&a+1); //+1相當於移動了5位 printf("%p\n%p\nbit = %d\n",a,p,p-a); printf("%d\n", *(p-1)); return 0; }