int*a的*a不是代表指针a只向地址的值吗?比如i=4,a=&i,那么*a=i=4吗?那么下面的*a或*(a...)怎么是地址

如题所述

首先你要知道你这张表对应的是二维数组,数组和指针有着密切的联系,但有本质上的区别。

先说数组,数组在计算机的内存上开辟了一段内存,其大小取决于数组声明的类型。(这个你懂吧,)这个内存的首地址就是数组的名字 。如一维数组 int a【10】 开辟了十个内存单元用来存放十个int型。这个数组会有一个首地址,它就是a的值。
对于二维数组而言 int a【10】【10】,你可以把它看成10行10列的矩阵,我们也常说它是数组的数组。a也是这个数组的首地址, 而a【0】 是第一行的首地址(我想你的问题在这里),而&a【0】【0】才是0行0列元素的地址。这三个地址的值是一样,但它却有着不同的含义。表格和一楼都说错了。
编译器是这样工作的,声明二维数组时,在第一维【n1】的后面放置【n2】,编译器就会创建一个大小为n1的数组,他的每个元素是一个大小为n2的数组。而数组的名称就是他的地址。 a【0】 就是在引用一个子数组的地址。因为它是子数组a行的名称。
指针和数组最大的区别在于:可以改变指针包含的地址,但不能改变数组名称引用的地址。所以我们可以用指针遍历整个数组。

说的不好的请多指教,共同学习。
建议你看 ivor horton 写的 C语言入门经典这本书。国际权威。他是世界的谭浩强。写的要比国内的著作好很多。如果你旨在学懂而非应试,建议你看这个。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-27
首先你得承认,指针是个又难又简单的问题,也许一个JAVA高手,都不一定理解指针;
理解的人,指针问题可以触类旁通,不理解,迷雾重重。。。
首先给你讲一下为什么有指针的存在? 在计算机存储中,每一个内存单元都有一个地址值,就像你家房子有个门牌号,它是自然存在的,否则这个存储单元就是孤立的。通过指针,进行取指操作,就可以访问你和你的家人。。。有了门牌号(指针),我就几乎不用问别人,可以顺势找到你家,道理很简单吧。那接下来就题论题。
a 是二维数组名,涉及到二级指针,就相当于我用有个门牌号,记录了你家的门牌号,那我拥有的门牌号就是二重门牌号,而第二段讲的指针就是一级指针,就是我直接知道你家的门牌号。
既然a是一个二级指针,那么a[n]的内容就是一级指针,也就是地址值,例如:a[0],0行地址,也是0行的第0个元素的地址,换句话,也可以说a[0]是0行0列地址。这里面还有个比较令人苦恼的问题,就是a的值是2000,a[0]的的值也是2000,那么&a[0][0]的值也会是2000,实际它们一样是必然的,因为它们的值的都和数组的第0个元素有关,但辈分不一样,所以取第0个元素过程不一样,**a==*a[0]==a[0][0].
我已经尽力深入浅出了,若还是不能理解,多想想,时间长了自然就明白了。
第2个回答  2012-07-27
数组的a【】的a 是数组名 也代表该数组的 地址所以*a 就是取出该数组第一个 地址的值 如果是二维当然 a【i】【i】 a【i】 就是a【i】行的首个数值的地址 那么*a【i】同样是取出该 数的值 a因为是地址 所以(a+1) 就是该数组下一个数值的 地址 *(a+1)同样也是取值。。。 int *a 的*只是定义 a是一个指针 在单独使用的时候是 类似于取出该地址的值的 作用。。。希望我说的对你能有帮助。。
第3个回答  2012-07-27
第二行,第二列。0行0列元素地址。错误!应该是“0行0列的值”

书不一定正确,能发现书的错误,并且很确定它是错的。那你就牛B了,目前看来你需要提高啊本回答被网友采纳
第4个回答  2012-07-27
a声明得不一样,你不把a的声明贴出来谁知道是什么东西
照这张图推算 ,a应该是二维数组,里面存的是指针,就是一个指向指针的指针
相似回答