Re: [问题] 二维阵列与双重指标关系

楼主: bald (好好)   2019-02-09 23:46:15
小弟最近在摸索二维阵列
看到前辈这篇文章 有些觉得奇怪的地方
想特地把觉得怪的地方提出来
请各位前辈指教 谢谢
※ 引述《s25g5d4 (function{}())》之铭言:
: ※ 引述《ipod7788 (小小凉)》之铭言:
: : 开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
: : codeblock GCC 4.8.1
: : 最近在学C++ 遇到双重指标与多维阵列问题
: : 有看到一个网页上
: : int x[1][20];
: : int (*p)[20] = x;
: : 比较常用以下写法
: : int **p=(int**)x;
: : 接着我想测试那个常用写法是否可以就自己写了一个小程式
: : int a1[3][2] ;
: : int** a2 = (int**)a1 ;
: : int count=0;
: : for (int i = 0; i < 3; ++i){
: : for (int j = 0; j < 2; ++j){
: : a1[i][j] = ++count;
: : std::cout << "a1["<<i<<"]["<<j<<"] :" << a1[i][j] <<"\t";
: : std::cout << "a2["<<i<<"]["<<j<<"] :" << *((*a2+i)+j) <<"\t";
: : }
: : printf("\n");
: : }
: : 我想说 如果 a1给值的话 照理说 a2也应该有设定到值
: : compiler没有问题 但是 执行之后 dos画面 会写 没有回应 就停止程式
: : 不知道是什么原因? 我有上网查过 用双重指标表示二维阵列的其他写法
: : 还是想问一下 这样写为什么有错误? 感谢!
: 首先你要知道指标也是值,只是这个值是内存位址
: 也就是该变量的型态是一个内存位址指向 int
: 所以 a1 指向 a1[0][0], *a1 指向 a1[0][0]
: 差别在于 a1 的型态是 (int [][]), *a1 的型态是 (int[])
: 本例中 a1 宣告为 int a1[3][2], 所以 a1 的型态是 int[3][2], *a1 => int[2]
: ** 阵列不是指标,只是可以当作指标使用 **
: 一维阵列可以被当作成指标,这是 C 的特性,但不可当作阵列等于指标
: 之所以指标可以接一维阵列是因为指标就是储存一个内存位址
: 所以让指标指向阵列的起始位址,就可以把指标当成阵列来操作
: Q: 为什么双重指标却不能拿来接二维阵列呢?
: 因为你宣告二维阵列时, compiler 知道你跳一个 row 会跳过多少 element
: 但是用双重指标的话, compiler 何德何能知道他要跳几个 element 当 row?
: 第二,双重指标也就是代表你要取值需要做两次 dereference
: 但是你让双重指标指向阵列的起始位址,你做第一次 derefernce 就拿到
: 第一个 element (a[0][0]) 的值了,再做 derefernce 下去会拿到什么?
这里有点奇怪
我尝试用设定a[3][3]
把 *a 的值printf出来
得到的结果是 address of a[0][0],
非 a[0][0] element的值
对照新手10诫, (#12)指出 a 是一个pointer to int [3],
故我认为应该是 *a 应该还是address
: Q: 那我把指标拿去接二维阵列然后自己算 offset 可以吗?
: 当然可以,但是你想一下如果 pointer 占的内存位址大小
: 比 element 大的时候怎么办?
: 你可不能取 *(a+0.5) 啊!!
作者: LPH66 (-6.2598534e+18f)   2019-02-09 23:47:00
是 address 啊, a 的第一列(的起头所在位址)所以原文在说如果这样的东西第一次 deref 就给你拿到值的话会造成问题
楼主: bald (好好)   2019-02-09 23:50:00
谢谢指导

Links booklink

Contact Us: admin [ a t ] ucptt.com