[问题] 指标使用疑问

楼主: w0005151 (蓝厅)   2016-02-15 22:29:55
之前是个只会用matlab的菸酒生
最近因兴趣使然开始自学C++,对于指标(pointer)与阵列的配合有些疑问
我非相关科系毕业,目前所学皆为自己估狗跟翻公司图书馆的书得到
因此很怕有观念搞错!
还望各位先进指正,非常感谢!
使用平台 VS2010/2012 C++
阵列为一维的时候,阵列名称代表此元素第一个的位址
所以可以如下使用
int M[3]={1,2,3};
int *ptr
ptr=M;
也等同于:
ptr=&M[0];
ptr是一个指向整数型态的指标,所以可以记录M阵列第一个值(是个整数)的位址
这样理解没错吧?
但阵列变二维的时候就变得有点复杂了
int M[2][3]={{1,2,3},{4,5,6}}
int *ptr
此时若让
ptr=M;
此时会出现错误
"型别int(*)[3]的值无法指派至型别double*的实体"
以下是我目前的解释,也是我想问的内容,请各位帮我看看我的理解对不对
M的型态是int(*)[3] 代表指向具有3个int变量的阵列的指标(这样解释不知对不对?)
而int*型态的宣告则没有限定这个指标指向的阵列具有几个变量
所以应该用 int (*)[3]型态的指标来指向M
必须要这样是因为C++在储存阵列时是以列优先
所以compiler必须先知道一列有几个变量(即总共有几行)好判断哪时该换列
int+1即代表内存位址往前 1*3(sizeof(int)) 个bytes,也就是换到下一列
若要使用int *ptr来指向M阵列则必须改成 ptr=&M[0][0]
但是!!
我在C的书上有看到直接让ptr=M的用法是可以通过的
实际上使用matlab内建的C compiler也是可行的
而且其效果跟ptr=&M[0][0]一模一样
这是为什么呢??
C跟C++的基本规则不是应该一样的吗?
还是这是不同compiler的问题?
另外补个小问题
char *ch="abc"
cout<<ch;
跑出来的竟然是abc而非0018ABC0这种内存位址
这是为什么呢
若将char*换成int*或double*这种
输出时不加*解参考的话,出来的的确就是位址没错
为什么唯独char不一样呢?
作者: Caesar08 (Caesar)   2016-02-15 23:30:00
我记得几个月前有类似的问题 http://goo.gl/qM355p
作者: overhead (overhead)   2016-02-15 23:50:00
为何会出现"..至型别double*的.."? 你没有用double啊@@
作者: PhysiAndMath (老师说要爱数学)   2016-02-15 23:50:00
第一个例子的M是指标;第二个M是指标的指标
楼主: w0005151 (蓝厅)   2016-02-16 00:07:00
抱歉因为我实际测试的程式是用double所以这边打错了@@但我输出看M和*M和&(M[0][0])都是同一个位址耶若M是指标的指标那M应该要和*M不一样不是吗?
作者: PhysiAndMath (老师说要爱数学)   2016-02-16 00:14:00
这就超出我能力范围了。不过我相信用**ptr=M,ptr[i][j] 是可以达到预期的结果的
作者: suwako   2016-02-19 10:26:00
1维阵列用1个*,2维阵列当然要用2个*阿
作者: LPH66 (-6.2598534e+18f)   2016-02-19 17:53:00
下面回文讲了这边再推一次, 二维阵列和指标的指标是不同的

Links booklink

Contact Us: admin [ a t ] ucptt.com