之前是个只会用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不一样呢?