使用數組時注意的一些問題

/*
 *數組注意的一些問題
 */

#include <iostream>
using namespace std;

int main()
{
 const int ArraySize = 5;
 //對數組中元素初始化,而沒有初始化的元素在默認的情況下會用數值0填充,代表的是空字符(NULL或\0)
 int arr[ArraySize] = {10,3,5};
 
 //數組名,表示的是第一個元素的起始地址(推薦直接使用數組名)
 cout << "arr = " << arr << endl;
 //數組是一個集合,對數組名取地址,取得是該數組所代表集合的首地址(一般不推薦使用對數組名取地址)
 cout << "&arr = " << &arr << endl;
 
 {
  /*數組名本身不是變量,所以它不佔用存儲空間,也不能用來存儲數據;,
    它只是代表一個數據,作爲值時,它代表數組中第一個數據元素的地址。*/
  //比如下面的做法就是錯誤的!!!
  /*編譯時報錯:incompatible types in assignment of ‘int’ to ‘int [5]’
   --- 在將整型分配給整型數組時出現類型不相容*/
  //arr = 1016;  
  /*編譯時報錯:assigning to an array from an initializer list*/
  //arr = {10,16,8};
 //因此,不能對數組賦值,只能對數組元素初始化或賦值。
 }

 //如果定義一個數組,沒有對其初始化,那麼其輸出的數據會是垃圾數據,而不是沒有值
 /*cout << "沒有對數組初始化,輸出的是垃圾數據!" << endl;
 for(int i = 0; i != ArraySize; i++)
  cout << arr[i] << ' ';
 cout << endl;*/
 
 //輸入數據,對數組arr中的數據元素進行賦值
 /*即使輸入的數據元素的個數大於數組的長度,cin 也只會根據數組的長度
   在輸入緩衝區中提取所需數據,而剩餘的數據會留在輸入緩衝區,供下次使用*/
 //cout << "輸入的數據分別是:" ;
 //for(int i = 0; i != ArraySize; i++)
  //cin >> arr[i];
 
 //下面是三種不同的方法輸出每個數組元素在內存中地址
 /*cout << "方法一:" << endl;
 for(int i = 0; i != ArraySize; i++)
  cout << "&arr[" << i << "] = " << &arr[i] << endl;
 cout << "方法二:" << endl;
 for(int i = 0; i != ArraySize; i++)
  cout << "[arr+" << i << "] = " << arr+i << endl;
 cout << "方法三:" << endl;
 for(int i = 0,*p = arr; p != (arr+ArraySize) && i != ArraySize; i++,p++)
  cout << "p -[" << i << "]= " << p << endl;*/
 
 /*下面四種輸出數組中元素的方法都沒有錯誤;
   編譯器在編譯時對數組中的方括號做了相應的變換:(兩邊都是相互等價的)
  arr[i] <=> *(arr+i)
    *(arr+i) <=> *(i+arr)
  *(i+arr) <=> i[arr]
  arr[i] <=> i[arr]
   i 是偏移量,表示偏移第一個元素的元素個數*/
 /*for(int i = 0; i != ArraySize; i++)
  cout << arr[i] << ' ';
 cout << endl;

 for(int i = 0; i != ArraySize; i++)
  cout << *(arr+i) << ' ';
 cout << endl;

 for(int i = 0; i != ArraySize; i++)
  cout << i[arr] << ' ';
 cout << endl;
 
 for(int* p = arr; p != (arr+ArraySize); p++)
  cout << *p << ' ';
 cout << endl;*/

 //越界訪問數組中的數據元素
 cout << "越界訪問的後果!" << endl;
 int iNum = 123,iLen = 90;
 int array[7] = {10,3,6,8,5,9,7};
 
 //越界訪問數據可能會訪問到無法與之的數據
 for(int i = -2; i != 9; i++)
  cout << array[i] << ' ';
 cout << endl;
 
 cout << iNum << "---" << iLen << endl;

 //越界存放數據可能會其它變量的值,甚至可能會導致程序崩潰(沒有發生這種情況,怪哉!!!)
 for(int i = -2; i != 7; i++)
  cin >> array[i];
 for(int i = 0; i != 7; i++)
  cout << array[i] << ' ';
 cout << endl;
 cout << iNum << "---" << iLen << endl;
 return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章