使用数组时注意的一些问题

/*
 *数组注意的一些问题
 */

#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;
}

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