发布日期:2016-01-06 10:48 来源: 标签: 编程语言 开发语言 C++入门教程 C++指针访问数组元素
本章我们主要学习C++中如何用指针访问数组元素,下面我们就做一下具体讲解,希望大家多多支持中国站长网络学院。
我们已经知道:数组名就是数组在内存中的首地址,即数组中第一个元素的地址。我们可以通过下标访问数组元素,也可以通过指针访问数组元素。对于下面的数组:
  int ara[5] = {10, 20, 30, 40, 50};
如果打印ara[0]和*ara均输出结果10,即数组ara第一个元素的值。如果要打印ara的第三个元素,可用下面的语句:
  cout << *(ara+2) ; // 即打印ara[2]
对于数组ara:
  ara+0 指向 ara[0]
  ara+1 指向 ara[1]
  ara+2 指向 ara[2]
  ara+3 指向 ara[3]
  ara+4 指向 ara[4]
虽然数组名是指针,但它是常量指针,数组名的值是不能改变的。
我们也可以用指针访问二维数组元素,不过比一维数组元素的访问麻烦一些。由于二维数组元素在内存中是一维的,且按行存放。所以用指针访问二维数组的关键是如何计算出某个二维数组元素在内存中的地址。例如,对于一个m行、n列的二维数组num,num[i][j](i≤m,j≤n)在内存中的地址应为:num+i×n+j。
例7-8:假定我们将一年四季的平均气温存放在一个二维数组temp中,例如,第三年的春、夏、秋、冬四季的平均气温分别为15、30、18、-1,则有:
  temp[2][0]=15;temp[2][1]=30;temp[2][2]=18;temp[2][3]=-1;
第五年的春、夏、秋、冬四季的平均气温分别为16、29、17、0,则有:
  temp[2][0]=16;temp[2][1]=29;temp[2][2]=17;temp[2][3]=0;
需要查找一年四季中的最高的平均气温,函数如下:
例7-9
  int HighestTemp (const int *temp, const int rows, const int columns)
  {
  int highest = 0;
  for (register i = 0; i < rows; ++i)
  for (register j = 0; j < columns; ++j)
  if (*(temp + i * columns + j) > highest)
  highest = *(temp + i * columns + j);
  return highest;
  }
本例中,函数的形参是一个int型指针和另外两个整型变量,以指定数组各维的大小。三个形参的const修饰符表示:temp指向的内容和rows、columns的值在函数中是不能修改的。用指针作函数形参同用二维数组作函数形参相比,更加灵活,因为二维数组作函数形参时,不能省略第二维大小的说明。
表达式*(temp + i * columns + j)是取数组的第i行、第j列的元素,等价于temp[i][j]。
由于二维数组在内存中的存储是一维的, HighestTemp函数实际上能够简化为用大小为row * column的一维数组来处理:
例7-10
  int HighestTemp (const int *temp, const int rows, const int columns)
  {
  int highest = 0;
  for (register i = 0; i < rows * columns; ++i)
  if (*(temp + i) > highest)
  highest = *(temp + i); return highest;
  }
前面已经提到过,C++中数组和指针是密切相关的。可以用指针访问数组的元素,这是因为数组名实际上就是指针,它指向数组的第一个元素。上面的例子实际上就是用指针访问数组元素,下面就这个问题,我们作进一步的说明。对于数组:
  int ara[5] = {10, 20, 30, 40, 50};
在内存中是这样存储的:
图7-16

由于数组名是数组的首地址,它是一个常量,所以不能改变。但是,对数组名可以在表达式中参与算术运算,例如:ara 指向 ara[0],表达式ara+1 指向 ara[1],…
指针可以象数组那样使用下标,这进一步表明了指针和数组的密切关系。例如,p是一个数组的指针,p[k]则指向该数组的第k+1个元素,所以,p[k]与*(p+k)是等价的。
此外,也可以用指针对多维数组进行访问。以二维数组为例,
  int m[3][3];
可以看成是以m[0]、m[1]、m[2]为首地址的三个一维数组,每个一维数组具有三个整型元素。如果定义了下面的指针数组:
  int *pm[0];
  pm[0]=m[0];
  pm[1]=m[1];
  pm[2]=m[2];
那么,指针数组的三个元素(即三个指针)分别指向三个一维数组。这样,就可以通过这三个指针对二维数组进行访问。例如:"m[2][0]=*(pm[2]);m[2][1]=*(pm[2]+1)"。
根据以上叙述,引用一个数组元素可以用:
(1) 下标法。即用a[i]形式访问数组元素,在前面介绍数组时都是采用这种方法。
(2) 指针法。即采用*(a+i)或*(p+i)形式,用间接访问的方法来访问数组元素,其中a是数组名,p是指向数组的指针变量,其初值为p=a。
下面三个程序段均以输出数组中的全部元素为例,说明它们的用法:
程序段7-1
  void main() //下标法
  {
  int a[10],i;
  for(i=0;i<10;i++)
  a[i]=i;
  for(i=0;i<10;i++)
  printf("a[%d]=%d\n",i,a[i]);
  }
程序段7-2
  void main()
  {
  int a[10],i;
  for(i=0;i<10;i++)
  *(a+i)=i;
  for(i=0;i<10;i++)
  printf("a[%d]=%d\n",i,*(a+i));
  }
程序段7-3
  void main() //指针法(用指针变量指向元素)
  {
  int a[10],i,*p;
  p=a;
  for(i=0;i<10;i++)
  *(p+i)=i;
  for(i=0;i<10;i++)
  printf("a[%d]=%d\n",i,*(p+i));
  }
因为,多维数组在内存中也是按照一维顺序存放的,所以访问的时候,也可以通过对指针作算术运算的方法对数组元素进行访问。

相关评论

专题信息
    Visual C++是一个功能强大的可视化软件开发工具,是高等院校计算机及相关专业主要核心课程。 本教程对Visual C++ 的应用与开发进行了详细系统的介绍,内容主要包括:Visual C++程序的建立,菜单、工具栏和状态栏的创建,对话框和常用控件,窗口、文档与视图,图形绘制,数据库应用,多媒体技术等。 本教程以案例教学为主,各章节都附有大量的实例,并且操作步骤详细,有利于引导读者更好的消化、理解和实际应用本章节所学的知识内容,希望大家能多多支持中国站长网络学院!