首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

生手-老谭教材一句话不解,求解释

2012-12-25 
新手-老谭教材一句话不解,求解释!我是个初二的学生,自学老谭的教程。 今天看到多维数组与指针这里有几句话

新手-老谭教材一句话不解,求解释!
   我是个初二的学生,自学老谭的教程。 今天看到多维数组与指针这里有几句话不能理解:

   有一个2维数组: int a[3][4]

   书中说 a代表二维数组首元素的地址,a[0],a[1],a[2]又分别代表第 0,1,2 行首元素的地址(因为他们看作为2维数组里面的一维数组)。

   这些我都看懂了,我不懂的是下面的:
   
           书中居然说:a+1和*(a+1)等价。 我就想不通了,a+1 是地址,而*(a+1) 是内容(值)吧?它们怎么会等价呢?

我百思不得其解。希望哪位高手能帮我解释下,谢谢了先!
[最优解释]
参考测试代码:


#include <iostream>

using namespace std;

int main() {
int array[2][4];
cout<<typeid(array).name()<<endl;
cout<<typeid(array+1).name()<<endl;
cout<<typeid(*(array+1)).name()<<endl;

return 0;
}


输出是:
A2_A4_i
PA4_i
A4_i

应用C++的类型系统,可以看出,array+1 返回的类型是一个指针,指向元素类型为整数,个数为4的数组。而C/C++中,对指针使用[]操作符以及对数组类型使用[]操作符是没有区别的。

这主要还是为了和大部分字符串操作、数组操作兼容而导致的。例如:

char *str = "abcd";
在这里str是一个指针,很多C用户喜欢直接根据指针获取第i个元素的引用:str[i],这种写法很“自然”,所以被编译器接受了。

另外:
char str[] = "abcd";
这种情况才是正统、严格的,str现在的类型是严格的字符数组类型(A5_c),那么,数组的[]操作就是被严格定义的:取出数组第i个元素引用的操作。

总结:
array+1返回的是指针类型:PA4_i,指向A4_i(4个整型元素)的数组。而*(array+1)返回的是数组类型:A4_i。所以根据上面描述,二者等价。
[其他解释]
初中生就不要浪费时间学编程了吧,至少等考上大学。
另外,就算你一定要学,也别用国产垃圾教材来浪费生命啊。
[其他解释]
引用:
初中生就不要浪费时间学编程了吧,至少等考上大学。
另外,就算你一定要学,也别用国产垃圾教材来浪费生命啊。

我要的是您给我解释啊,你能告诉我原理吗?我看到练习册上答案也是这样的
[其他解释]
还有 为什么初二的学生就不能学?

希望大家能帮我解答书中问题!
[其他解释]
这样看,把它拆为a[3]、b[4]两个数组,a[3]的每一个元素都是一个指针值,每个这样的指针值都指向一个b[4]数组的首元素地址。
初中生就别学C了,要学就学最简单的VB吧。学C至少读完高一放暑假再学吧。
[其他解释]
引用:
初中生就不要浪费时间学编程了吧,至少等考上大学。
另外,就算你一定要学,也别用国产垃圾教材来浪费生命啊。


++
[其他解释]
我觉得..想自学..真心想学的...就不要看..国产的教材....<primer Plus C>..上面我记得 有你这个问题的详细解释.....真的不要看什么谭浩强....

LZ应该能理解指针吧....一维数组暂且理解为一维指针..就是说int *p; p就是指向int型的...二维数组...暂且理解为二维指针...就是说..int **q; q是指向什么型的呢...q是指向p这种类型的...也可以说q是指针的指针..q是指向指针类型的..  那么我们给开始赋值...

int *p;
int **q;
int a = 5;
p = &a, q = &p;
  
一维指针使用数据时 要*p....那么二维指针就要**q了..就是说..*p == 5, **q == 5...
对q第一次解除引用是 *q == p..那么 **q == *p == 5了吧..
回到你的问题..a看成是二维指针吧...(a+1)还是二维指针吧.相当于上面的q吧.........对(a+1)解除一次引用 *(a+1)你说这表示什么..你自己说...
为什么说a+1 == *(a+1)呢..是因为a+1恰好是(也必然)是 &(a[1][0]) 这个元素的地址...因为首地址的问题所以这是成立的...

我给你举个例子..你好好理解下啊...a[3][4];
a == a[0] == *a == &(a[0][0])
a+1 == a[1] == *(a+1) == &(a[1][0])
....

LZ建议你还本书...













[其他解释]
引用:

   我是个初二的学生,自学老谭的教程。 今天看到多维数组与指针这里有几句话不能理解:

   有一个2维数组: int a[3][4]

   书中说 a代表二维数组首元素的地址,a[0],a[1],a[2]又分别代表第 0,1,2 行首元素的地址(因为他们看作为2维数组里面的一维数组)。

   这些我都看懂了,我不懂的是下面的:
   
           书中居然说:a+……



你说说的那个 a+1是地址...我想问你..你知道它代表什么地址嘛???? 我想你就是在这出了问题....
咱不用a+1表示..咱也..a+0 来说明问题..也就是 a... a代表整个二维数组的地址吧...而且! 它还代
表 a[0][0]元素的地址...她说的a+1其实是表达后者....(a+1+0)...

[其他解释]
引用:
这样看,把它拆为a[3]、b[4]两个数组,a[3]的每一个元素都是一个指针值,每个这样的指针值都指向一个b[4]数组的首元素地址。

a为a[3]数组首元素a[0]的针,a+1为a[1]的指针,*a、*(a+1)为a[0]、a[1]的内容,这个内容分别为指向第一个b[4]数组首元素和第二个b[4]数组首元素地址的指针,*(a+1)+1则为指向具体某个b数组元素的指针,*(*(a+1)+1)则为这个指针所指元素的内容。
[其他解释]
a[1][0]==*(a[1]+0)==*(*(a+1)+0)==**(a+1);//全是内容,那么*(a+1)就是地址了

还有一点,数组名的特殊用途——数组名是数组的首地址,这就是为什么a+1也是地址了。楼主分开记吧,免得混。

还有给点建议就是:老谭的书呢,新手看也不错,毕竟刚进门也没什么书,找亲戚什么的,不是专业的也就给你老谭的书(我们学校C就是老谭的)。但是呢,看老谭的书,不用看他具体内容,把上面的语法全练习好了(我说的是常用的,像楼主提出的这种问题的语法不要用,用自己能看懂,最熟悉的),课后题能自己用代码编写就ok了。有了一定基础之后,想继续深造的,再去看一些高级的书。像C++ Primer什么的,把当初没弄懂的看懂。现在给你,估计够你受的(不薄啊那本书)。

楼主现在还小,先把基础语句练熟,兴趣培养好就成。
[其他解释]
解释就是 渣书
a+1和*(a+1)等价
这句话是错误的
两者不等价 
[其他解释]
老谭啊老谭,连初中生都不放过,罪孽啊!
[其他解释]
老谭的书 考2级 还可以 其他就算了。
推荐看 C Primer plus

热点排行