| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2216 人关注过本帖
标题:有关教材中二维数组基类型和存储单元的疑问
只看楼主 加入收藏
william1993
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2017-4-14
结帖率:0
收藏
 问题点数:0 回复次数:12 
有关教材中二维数组基类型和存储单元的疑问
高教版C语言教材中有关二维数组和指针关系的部分,有几条说明我没有看明白,想求论坛大神帮忙解惑。
1.定义如下:
  int *p, a[3][4];
  在此定义下,教材中说a[0]+1中的1应该理解为2个字节。但是前面我看到,在vc6.0的环境下,int类型的数据是占用4个存储单元的,a[0]既然代表的是二维数组中第一行的首地址值,+1就应该代表a[0][1]的地址值,也就是变化了一个存储单元才对,那么1应该是4个字节啊,为什么是2个字节呢?
2.教材中说,以上a数组,数组名a的值与a[0]的值相同,只是其基类型为具有4个整形元素的数组类型。请问这个“其”是指a还是a[0]?或者再详细的问下,如何理解a与a[0]的基类型不同,不都是int类型吗?为什么定义中的指针变量p与a[0]的基类型相同,与a就不同了呢,a不也是个地址值么,为什么不可以赋值给p?
搜索更多相关主题的帖子: 元素 C语言 
2017-05-26 10:50
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
其实别被卖了~
p指向的没有a和a[0]的区别~只是代表一个地址值~关键是读取元素和p的指针类型有关~
读取数据是地址值还是储存值就要看*p是否具有数组性质~如果*p具有数组性质则读取的是地址值~如果否则读取的是储存值~这里显然*p就是int型不具备数组性质~因此读取的是储存值~不过编译器一般会在p=a这操作给出数据类型不匹配的警告~这个要注意一下~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-26 10:59
william1993
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2017-4-14
收藏
得分:0 
回复 2楼 九转星河
那具有数组性质的指针变量p一般是怎么定义的?
还有关于那个1代表2个字节怎么解释?
2017-05-26 11:06
william1993
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2017-4-14
收藏
得分:0 
回复 2楼 九转星河
那具有数组性质的指针变量p一般是怎么定义的?
还有关于那个1代表2个字节怎么解释?
2017-05-26 11:06
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 william1993
具有数组性质~
int (*p)[4];
这样~
就是指代指针数组~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-26 11:16
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 4楼 william1993
1代表两个字节的还是要看编译器的具体行为才行~课本不一定完全和编译器对得上号来~或许指代的是早期编译器一个int型占两个字节吧~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-26 11:21
william1993
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2017-4-14
收藏
得分:0 
回复 5楼 九转星河
也就是说如果是在vc6.0的环境下做的这么个定义,那么对于表达式a[0]+1,1应该就是代表1个int型元素,也就是4个字节是吧?
2017-05-26 16:18
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
如果只是单纯的对指针进行加减法,你不需要管步长是多少,编译器会处理这些事情。

int占2字节,还是4字节,对指针的加减法毫无影响。

你的题目,为什么不能让p 指向二维数组a ,这是因为类型不同,p的类型是 int *, 而a的类型是int (*)[]。
如果你死了心要让p指向a,可以 p = a[0]。a[0]的类型是int *,或者用类型转化,但是我并不推荐。

[此贴子已经被作者于2017-5-26 16:26编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-26 16:23
william1993
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2017-4-14
收藏
得分:0 
回复 8楼 renkejun1942
问题是后面有些关于存储单元长度的一些说明,如果这里我不搞清楚是教材的问题还是有我忽略的点,后面我会混乱的。就VC6.0的环境下是不是a[0]+1中的“1”代表4个字节呢?

[此贴子已经被作者于2017-5-26 16:33编辑过]

2017-05-26 16:28
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 9楼 william1993
对指针的加(减)数值n,增加(减少)的是n个步长。

这个步长既是 指针类型所占用的字节数。

假设在某个实现上 int 占用4个字节,这个步长就是 4。在这个实现上,对int 指针加1,前进的是 4个字节。

但是……这真有必要去记吗?

[此贴子已经被作者于2017-5-26 16:40编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-26 16:35
快速回复:有关教材中二维数组基类型和存储单元的疑问
数据加载中...
 
   



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

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