鱼C论坛

 找回密码
 立即注册
查看: 1632|回复: 20

[已解决]一维数组和二位数组基类型我看不懂,好米糊

[复制链接]
发表于 2020-8-13 22:23:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有没有朋友能用简单方式说一下一维数组和二维数组的基类型
最佳答案
2020-8-13 23:01:24
a[i][j]是个二维数组,它的解读也可以说成含i个元素的一维数组,数组中的每个元素为一个有j个元素的数组。
所以a表示的是a[0]的地址(同时是数组的地址),步长为j*基本元素类型字节,
但是注意,a[0][0]为a[0]的首元素,它的地址与a[0]一致的,且与a一致(即&a == &a[0] == &a[0][0])
避坑点:&a代表的是一个数组的地址,&a+1即偏移一整个数组步长的内存单元
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 22:26:10 | 显示全部楼层
额,你就把数组当指针看,然后去掉最后一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 22:27:15 | 显示全部楼层
比如 int** p 基类型为 int*,int* q[] 基类型也是 int*。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 22:28:17 | 显示全部楼层
话说,基类型这个概念就不是很明确
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 22:31:54 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-13 22:26
额,你就把数组当指针看,然后去掉最后一个

数组和指针除了在当作函数参数的时候才能等价看吧;
其他时候就谈不上等价了,单单是内存方面就会带来很多问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 22:33:59 | 显示全部楼层
CodingCat_k 发表于 2020-8-13 22:31
数组和指针除了在当作函数参数的时候才能等价看吧;
其他时候就谈不上等价了,单单是内存方面就会带来很 ...

是的,问题是基类型这个概念本身也不明确啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-13 22:34:00 | 显示全部楼层
本帖最后由 崔铭1315 于 2020-8-13 22:36 编辑
永恒的蓝色梦想 发表于 2020-8-13 22:26
额,你就把数组当指针看,然后去掉最后一个


先给出定义 *p,a[3][4];
二维数组地址五种表达式
(1)&a[i][j]
  (2)a[i]+j
  (3)*(a+j)+j
  (4)&a[0][0]+4*i+j
  (5)a[0]+4*i+j
为什么 a[i],a[0]中的常量1的单位是2个字节,为什么a+4*i+j不行,a不是相当与a[0]吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 22:34:23 | 显示全部楼层
崔铭1315 发表于 2020-8-13 22:34
先给出定义 *p,a[3][4];
二维数组地址五种表达式
(1)&a[j]

请使用代码格式发布。

评分

参与人数 1鱼币 +4 收起 理由
崔铭1315 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-13 22:35:16 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-13 22:28
话说,基类型这个概念就不是很明确

我看的书上说的太概念,绕的我看不懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 22:37:31 | 显示全部楼层
崔铭1315 发表于 2020-8-13 22:34
先给出定义 *p,a[3][4];
二维数组地址五种表达式
(1)&a[j]
为什么a,a[0]中的常量1的单位是2个字节
大哥我求求你了,麻烦你把话说清楚,你每次提问说的话也很 “米糊”

评分

参与人数 1鱼币 +5 收起 理由
崔铭1315 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-13 22:37:46 | 显示全部楼层
CodingCat_k 发表于 2020-8-13 22:31
数组和指针除了在当作函数参数的时候才能等价看吧;
其他时候就谈不上等价了,单单是内存方面就会带来很 ...

数组名不是可以看成地址常量,也可以看成指针变量,我有点晕
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 22:44:02 | 显示全部楼层
崔铭1315 发表于 2020-8-13 22:37
数组名不是可以看成地址常量,也可以看成指针变量,我有点晕

数组名就是一个常量,不可修改的左值,因此也不可以进行数组间的赋值;
数组名代表着一个数组的起始地址(首元素地址),
地址值在计算机内存中是固定的,试想一下,要是内存地址值为变量,那数据存储怎么进行?
指针变量是用来存储地址值的变量,其本身也有一个内存地址(起始内存单元首地址)以及用于存储数据的一定的内存空间

评分

参与人数 1鱼币 +5 收起 理由
崔铭1315 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-8-13 22:53:03 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-13 22:37
大哥我求求你了,麻烦你把话说清楚,你每次提问说的话也很 “米糊”


先给出定义:
*p,a[3][4];
二维数组元素的地址
二维数组元素的地址可以由表达式&a[i][j]求得,也可以通过每行得首地址来表示。以上
二维数组a中,每个元素得地址可以通过每行的首地址:a[0],a[1],a[2]表示。如:地址
&a[0][0]可以用a[0]+0来表示,地址&a[0][1]可以用a[0]+1来表示;若0<=i<3,0<=j<4,
则a[i][j]的地址可用以下五种表达式求得:
(1)&a[j]
  (2)a+j
  (3)*(a+j)+j
  (4)&a[0][0]+4*i+j
  (5)a[0]+4*i+j
在以上表达式中,a[i],&a[0][0],a[0]的基类型都是int类型,系统将自动据此来确定表达式中
常数1的单位是2个字节。但是不可以把求a[i][j]地址的表达式写成:a+4*i+j,因为a的基类型
是4个整形元素的数组类型,系统将自动据此来确定常量1的单位是8个字节。


不理解
int为啥是2字节,还有a不是和a[0]没区别吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 22:58:44 | 显示全部楼层
崔铭1315 发表于 2020-8-13 22:53
先给出定义:
*p,a[3][4];
二维数组元素的地址

请使用代码格式发布!

评分

参与人数 1鱼币 +5 收起 理由
崔铭1315 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 23:01:24 | 显示全部楼层    本楼为最佳答案   
a[i][j]是个二维数组,它的解读也可以说成含i个元素的一维数组,数组中的每个元素为一个有j个元素的数组。
所以a表示的是a[0]的地址(同时是数组的地址),步长为j*基本元素类型字节,
但是注意,a[0][0]为a[0]的首元素,它的地址与a[0]一致的,且与a一致(即&a == &a[0] == &a[0][0])
避坑点:&a代表的是一个数组的地址,&a+1即偏移一整个数组步长的内存单元

评分

参与人数 1鱼币 +5 收起 理由
崔铭1315 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-13 23:01:46 | 显示全部楼层
CodingCat_k 发表于 2020-8-13 22:44
数组名就是一个常量,不可修改的左值,因此也不可以进行数组间的赋值;
数组名代表着一个数组的起始地址 ...

先给出定义:
*p,a[3][4];
二维数组元素的地址
二维数组元素的地址可以由表达式&a[j]求得,也可以通过每行得首地址来表示。以上
二维数组a中,每个元素得地址可以通过每行的首地址:a[0],a[1],a[2]表示。如:地址
&a[0][0]可以用a[0]+0来表示,地址&a[0][1]可以用a[0]+1来表示;若0<=i<3,0<=j<4,
则a[j]的地址可用以下五种表达式求得:
(1)&a[j]
  (2)a+j
  (3)*(a+j)+j
  (4)&a[0][0]+4*i+j
  (5)a[0]+4*i+j
在以上表达式中,a,&a[0][0],a[0]的基类型都是int类型,系统将自动据此来确定表达式中
常数1的单位是2个字节。但是不可以把求a[j]地址的表达式写成:a+4*i+j,因为a的基类型
是4个整形元素的数组类型,系统将自动据此来确定常量1的单位是8个字节。


不理解
int为啥是2字节,还有a不是和a[0]没区别吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 23:05:29 | 显示全部楼层
崔铭1315 发表于 2020-8-13 23:01
先给出定义:
*p,a[3][4];
二维数组元素的地址

i 又从哪啊?自己不检查?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 23:05:53 | 显示全部楼层
多维数组这个在C/C++里面也确实是个迷惑最多的地方,浅尝则可,前期不必要花太大功夫去整,如果想了解更多,参考书目《C与指针》
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-13 23:07:36 | 显示全部楼层
CodingCat_k 发表于 2020-8-13 23:05
多维数组这个在C/C++里面也确实是个迷惑最多的地方,浅尝则可,前期不必要花太大功夫去整,如果想了解更多 ...

好的书已经买了,我后天自己看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-13 23:10:40 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-13 23:05
i 又从哪啊?自己不检查?

老师,我这本书数组这章页数有点多,推的我有点迷糊了,下次提出问题,我一定说明白了,这次我自己在研究研究。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 06:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表