| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2393 人关注过本帖
标题:[原创]谭浩强《C程序设计(第二版)》或《C++程序设计》讲解有误导或者疏漏 ...
取消只看楼主 加入收藏
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
 问题点数:0 回复次数:3 
[原创]谭浩强《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编辑过]


搜索更多相关主题的帖子: 谭浩强 疏漏 讲解 误导 
2005-07-04 16:01
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
得分:0 
当然 二维数组 是 一维数组的延伸. 但是,我们在概念上不能混同它们. 他的概念是“指向由m个元素组成的一维数组的指针变量” 在最接近此概念的地方,你自己都说 "p = a; // p 指向了二维数组的首地址, 也可以理解为....等等" 注意, 你这里强调的是"二维数组". 还有,从另一方面说, 对这句话来说, 本身就是多种"歧义"的: 1, 指向一维数组的指针变量,这个一维数组由m个元素组成的 2, 指向一维数组的指针变量,指针变量由m个元素组成的 3, 是指针变量,它(或它们)指向由m个元素组成的一维数组 .... 科研是严谨的,这样表述严谨吗? 再看他的例子: int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; //除此之外,没有说明一维和多维数组都可以..也容易造成误解 int (*p)[4],i,j; //这里的[4]与上面的[4]雷同,(实际上这个数是可以任意指定的!) 这使人误解. 再看看,在此段的讲解中,不难发现: 几乎找不到"二维数组"的概念,绝大多数笔墨是"一维数组"... 补充一下:

int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int (*p)[4],i,j;

//注意:此处的[4]与上面的[4]一模一样.实际上可以为任意的数!

他这样讲解,没有讲出xxx (*p)[n]这种构造的真正关键之处!

相反会误导..

你当时就理解成可以为任意的数吗?

p=a; //此处赋值也是这样,正好把a数组的第一元素的地址赋给p,实际上可以任意指定位置

(当然必须有效),比如 p=a+1, or p=&a[1][2]等等..这样才能理解真正的含义...

cout<<*(*p+i)+j); //此处是以二维数组的格式引用的,

而概念却是"指向由m个元素组成的一维数组的指针变量." 你没有疑问吗?

而且,经过上面的的任意指定地址后,仍然可以用相当于二维数组的结构的方式来引用!

妙就妙在这里!

这些他都没有讲...

大家没有同感吗?..

[此贴子已经被作者于2005-7-5 14:57:40编辑过]


有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2005-07-05 00:55
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
得分:0 
对于已经学成者来说,已经早早走过了这个阶段,
但是他的这个教材是最基本的教材种类,要知道,此书的读者是初学者,
必须要把最基本的枝节弄清楚的
没有局部怎么有宏观?

我的帖子已经很清楚的表书了我的意思, 我觉得他没有讲解到要害处,会使学习者一知半解..


[此贴子已经被作者于2005-7-5 21:20:46编辑过]



有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2005-07-05 21:19
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
得分:0 
以下是引用yameng在2005-7-6 1:45:20的发言: grub2linux好象看帖时总是不怎么仔细体会,有时还要针尖对麦芒的争一下。
嘿嘿,yameng也在这儿..? 没错, 我是程序员论坛的学-钱能C++ 呵呵.. 说实话,你这话我有点不同意的,对学习问题我是追根究底,为了弄清楚疑惑,对解答者的回帖,当然是认真看的 人家好心化时间写帖帮助嘛.当然是珍惜的,不过觉得kai朋友倒是可能没有细看我的对谭老师在这一知识点上的意见... 要说"针尖对麦芒",我觉得研究问题倒是应该提倡的,这样才能精细的互相发现理解不到的地方, 只要对问题不对人,有什么不好呢?

[此贴子已经被作者于2005-7-6 8:33:31编辑过]


有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2005-07-06 08:28
快速回复:[原创]谭浩强《C程序设计(第二版)》或《C++程序设计》讲解有误导或者 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032692 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved