Re: [问题] 指标使用疑问

楼主: LPH66 (-6.2598534e+18f)   2016-02-16 03:28:59
一切的问题都是指标型态
你对 int (*)[3] 的理解是正确的
之所以不能做 ptr = M 的原因正是因为 int* 和 int (*)[3] 是两种指标
虽然都是指标, 但指向的东西不一样
至于是哪里不一样这一点, 你也已经理解的差不多了
也因此, 要能做 ptr = M 就要让 ptr 也宣告成这种指标
宣告法有点丑, 长成这样→ int (*ptr)[3];
我没有实际看过 matlab 的 C compiler 是怎么回事
不过我想里面可能是对矩阵有一些处理
使得它能够被转成一个 int * 指标, 才能写出 ptr = M; 这种东西
至于你在推文问的
→ w0005151: 抱歉因为我实际测试的程式是用double所以这边打错了@@ 02/16 00:07
→ w0005151: 但我输出看M和*M和&(M[0][0])都是同一个位址耶 02/16 00:09
→ w0005151: 若M是指标的指标那M应该要和*M不一样不是吗? 02/16 00:10
这两个的差别依然是型态不同
即使指向同一个地方, 型态不同对它们的操作就会有所不同
但只印出值时没办法告诉你它的型态是什么而已
=====
顺带一提, 你上面推文提到指标的指标
这里正好有一个相关的状况:
在 C 语言里, 动态宣告二维阵列基本上会开两块空间
一块是“列指标”阵列, 这阵列会存放指向各列的阵列开头的指标:
int **matrix = (int **)malloc(sizeof(int *)*3);
int *elements = (int *)malloc(sizeof(int)*(3*5));
for(i = 0; i < 3; i++) matrix[i] = &elements[i*5];
在这种状况下, 这个 matrix 变量的型态才真正的是“指标的指标” int **
如果你去印出 matrix 和 *matrix 的值的话会看到你所预期的“不同的值”
但这只是因为 *matrix 会变成往这个列指标阵列里取值而已
和一开始的 int M[3][3]; 的状况是完全不同的
=====
cout << char* 的问题
这个是因为自 C 语言以来, 一个 char 指标很多时候是代表一个 C 字串的
尤其对于字串实字 (string literal) 语言规定上它的型态就是 char *
例如写上 "Hello, World!" 会在程式中划一块空间长 14 byte
填入 {'H', 'e', 'l' ,'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\0'}
然后把指向这块空间的开头的指标做为这个 literal 的“值”, 其型态为 char *
也因为大多数时候 char * 是指字串, 因此 cout 的 << 就对 char * 变量特别处理
要他看到这种型态的变量时去印出那个指标指向的字串, 而不是指标值本身
作者: PhysiAndMath (老师说要爱数学)   2016-02-16 08:30:00
受教了
作者: ss780217 (Wade)   2016-02-19 21:33:00
push

Links booklink

Contact Us: admin [ a t ] ucptt.com