/*
*數組注意的一些問題
*/
#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;
}