C語言陣列中的地址偏移問題
阿新 • • 發佈:2019-01-08
本文討論在C/C++中,一維陣列和二維陣列中的地址偏移問題。
一維陣列 int a[3];
二維陣列 int a[3][3];
1、先看一維陣列的情況:
- #include <iostream>
- usingnamespace std;
- int main()
- {
- int a[3] = {1,2,3};
- cout << &a << endl;
- cout << a << endl;
- cout << &a[0] << endl;
-
cout << a[0] << endl;
- cout << &a + 1 << endl;
- cout << a + 1 << endl;
- cout << &a[0] + 1 << endl;
- cout << a[0] + 1 << endl;
- system("pause");
- return 0;
- }
從結果中可以看出,&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、二維陣列的情況
- #include <iostream>
- usingnamespace std;
- int main()
- {
-
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
- cout << &a << endl;
- cout << a << endl;
- cout << &a[0] << endl;
- cout << a[0] << endl;
- cout << &a[0][0] << endl;
- cout << a[0][0] << endl;
- cout << &a + 1 << endl;
- cout << a + 1 << endl;
- cout << &a[0] + 1 << endl;
- cout << a[0] + 1 << endl;
- cout << &a[0][0] + 1 << endl;
- cout << a[0][0] + 1 << endl;
- system("pause");
- return 0;
- }
結果分析:
&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代表著二維陣列中第三級別的地址。