程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言數組中的地址偏移問題

C語言數組中的地址偏移問題

編輯:關於C語言

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

一維數組 int a[3];

二維數組 int a[3][3];

 


1、先看一維數組的情況:


[cpp]
#include <iostream>  
 
using namespace 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; 

#include <iostream>

using namespace 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、二維數組的情況


[cpp]
#include <iostream>  
 
using namespace 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; 

#include <iostream>

using namespace 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代表著二維數組中第三級別的地址。


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved