1. 程式人生 > >C語言陣列中的地址偏移問題

C語言陣列中的地址偏移問題

本文討論在C/C++中,一維陣列和二維陣列中的地址偏移問題。

一維陣列 int a[3];

二維陣列 int a[3][3];

1、先看一維陣列的情況:

  1. #include <iostream>
  2. usingnamespace std;  
  3. int main()  
  4. {  
  5.     int a[3] = {1,2,3};  
  6.     cout << &a << endl;  
  7.     cout << a << endl;  
  8.     cout << &a[0] << endl;  
  9.     cout << a[0] << endl;  
  10.     cout << &a + 1 << endl;  
  11.     cout << a + 1 << endl;  
  12.     cout << &a[0] + 1 << endl;  
  13.     cout << a[0] + 1 << endl;  
  14.     system("pause");  
  15.     return 0;  
  16. }  


從結果中可以看出,&a、a、&a[0]表示的是同一地址,但是級別是不一樣的。

&a+1地址與&a相比,偏移了12個位元組,即宣告陣列的空間大小;

a+1地址與a相比,偏移了4個位元組,即陣列中一個元素的空間大小;

&a[0]+1地址與&a[0]相比,偏移了4個位元組,即陣列中一個元素的空間大小;

也就說&a、a、&a[0]雖然都表示同一地址,但是編譯器會區分它們,&a指向整個陣列的地址,是陣列中最高級別的地址,而a和&a[0]表示&a代表地址的下一級別的地址。

2、二維陣列的情況

  1. #include <iostream>
  2. usingnamespace std;  
  3. int main()  
  4. {  
  5.     int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};  
  6.     cout << &a << endl;  
  7.     cout << a << endl;  
  8.     cout << &a[0] << endl;  
  9.     cout << a[0] << endl;  
  10.     cout << &a[0][0] << endl;  
  11.     cout << a[0][0] << endl;  
  12.     cout << &a + 1 << endl;   
  13.     cout << a + 1 << endl;  
  14.     cout << &a[0] + 1 << endl;  
  15.     cout << a[0] + 1 << endl;  
  16.     cout << &a[0][0] + 1 << endl;     
  17.     cout << a[0][0] + 1 << endl;  
  18.     system("pause");  
  19.     return 0;  
  20. }  


結果分析:

&a、a、&a[0]、a[0]、&a[0][0]表示的是同一地址,但是級別差距很大。

宣告的 int a[3][3] 大小為36位元組。

&a+1地址與&a相比,偏移了36個位元組,即宣告陣列的空間大小;

a+1地址與a相比,偏移了12個位元組,即陣列中一行元素的空間大小;

&a[0]+1地址與&a[0]相比,偏移了12個位元組,即陣列中一行元素的空間大小;

a[0]+1地址與a[0]相比,偏移了4個位元組,即陣列中一個元素的空間大小;

&a[0][0]+1地址與&a[0][0]相比,偏移了4個位元組,即陣列中一個元素的空間大小;

由以上可以看出,&a是最高級別的地址,a+1與&a[0]+1是第二級別的地址,a[0]+1與&a[0][0]+1代表著二維陣列中第三級別的地址。