[原创]谭浩强《C程序设计(第二版)》或《C++程序设计》讲解有误导或者疏漏!
谭浩强《C++程序设计》P182(或 C程序设计(第二版)P229 也差不多)中关于xxx (*p)[n] (xxx为数据类型,n为数组元素个数) 的讲解有误导或者疏漏!
他的概念是“指向由m个元素组成的一维数组的指针变量”
但是下面的代码中却以二维数组的格式才能引用,换句话说,按以上的概念以一维数组的格式
根本就不能引用!(大家可以试试,比如 cout<<*(p+0)或p[0];)
#include <iostream>
using namespace std;
int main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4],i,j;
cin>>i>>j;
p=a;
cout<<*(*p+i)+j)<<endl; // 此处仅仅是a数组的简单重复,完全可直接用a[i][j] *(*(a+i)+j)来引用
return 0;
}
实际上,xxx (*p)[n] 是指固定以n个元素为一组,一直类推下去。。。这样,实际上内含二维数组的结构。引用时,要指定延伸的次数,
比如:
int a[20]={1,2,3,4,5,6,7,8,9,10,11,12,13......};
// 改成二维数组或多维数组也一样:
// int a[2][10]={1,2,3,4,5,6,7,8,9,10,11,12,13......};
// int a[2][2][5]={1,2,3,4,5,6,7,8,9,10,11,12,13......};
int (*p)[3]=a; // 以3个元素为一组,一直类推下去。。。
printf("%d",p[2][4] 也可以*(*(p+2)+4)); // 表示要引用,从类推2次后(从0开始)的地址(7的地址)往后数第4个数(从0开始),
就是11。 // 如果改成 printf("%d",p[2](在0到2之内)); 编译就会出错,因为仅仅是地址。
(但xxx (*p)[n] 好象在钱能的C++程序设计教程 清华版 里没提到)
[此贴子已经被作者于2005-7-9 17:32:46编辑过]