1. 程式人生 > >a+1和&a+1

a+1和&a+1

16px color article .net 分布圖 detail 一個 har start

首先a是一個數組名,當看到這個a與&a時,一般我們的理解都是這個數組的首地址。沒錯,如果加上打印的話,確實兩個值是一樣的。

不過&a是整個數組的首地址,a則是數組首元素的地址,雖然值一樣,但是意義卻不相同。

在此之前有必要先看下c程序在內存中的分布圖。

技術分享

示例代碼:

  1. #include <stdio.h>  
    int main(int argc, char *argv[])  
    {  
        int i;  
        int a[]={1, 2, 3, 4, 5};  
        int s;  
        int *p = (int *)(&a+1
    ); printf(" a = %p\n&a = %p\n", a, &a); for(i = 0; i < 5; i++) printf("a[%d] = %p\n", i, &a[i]); printf(" p = %p\n&p = %p\n&s = %p\n", p, &p, &s); return 0; } 運行結果: a = 0022FF40 &a = 0022FF40 a[0] = 0022FF40 a[1] = 0022FF44 a[2] = 0022FF48 a[
    3] = 0022FF4C a[4] = 0022FF50 p = 0022FF54 &p = 0022FF38 &s = 0022FF3C

由上面的運行結果,我們可以知道a和&a的區別了。可得下圖:

技術分享

因為是運行在main函數體內的變量,所以這些都是在棧中運行的,所以p指針是指向了a[4]後的那個地址,而p本身的地址是在棧中分配的。

綜上可知

&a+i = a + i*sizeof(a);

a+i = a +i*sizeof(a[0]);

參考:http://blog.csdn.net/eastmoon502136/article/details/8630790

a+1和&a+1