一个关于C++数组的小问题
这是一个测试指向数组的指针数组的例子。是一本C++教程里的现成例题。pf是一个指针数组,每个元素分别存放不同数组的地址。代码如下:
#include<iostream.h>
void main()
{
double aa[2]={1.1,2.2},bb[2]={3.3,4.4},cc[2]={5.5,6.6};
double (*pf[3])[2];
pf[0]=&aa;pf[1]=&bb;pf[2]=&cc;
for(int i=0;i<3;i++)
{
for(int j=0;j<2;j++)
cout<<*(*pf[i]+j)<<" ";
cout<<endl;
}
}
输出如下:
1.1 2.2
3.3 4.4
5.5 6.6
我把代码试验过了,没有问题,但是我有个地方一直不明白,很长时间了。既然数组名是该数组的首地址,是一个指向本身首地址的指针,为什么代码中还要用pf[0]=&aa 之类的语句,为什么需要用&这个运算符呢?aa本身不就是个指针吗?它不就是一个十六进制的地址值吗?一直不明白。但是我试着把&符去了然后编译运行,甚至都不能通过编译,提示有错误。想问下CSDN的达人这到底是怎么回事。拜托讲详细点!这一直是我最困惑的地方。如果满意结贴的话,定有额外加分送给真诚回复者。谢谢!
[解决办法]
pf(指针数组)->【 pf[0] 的地址】-> 【aa的地址】 aa->【数组的首地址 即aa[0]的地址】
【 pf[1] 的地址】
【 pf[2] 的地址】
pf是和aa不同一个级别的,pf[0]才和aa 是同样的数据类型(pf[0] 的类型是 double [2] ,aa 的类型也是double [2])。
pf[0]中存放的是&aa 即aa数组的首地址的地址。
那么*(pf[0]) 就等于 aa 。
那么*(pf[0])+1就等于 aa+1 即aa[1];
[解决办法]
In your example, &aa is equal to aa *in value* but different in syntax. Even if &aa is equal to aa in value, but you can not assign aa to pf[0] (which type is pointer to array of length 2) because type of aa is [2] (length 2 array). Type of &aa is pointer to [2] (pointer to array of length 2) which is same as pf[0].
[解决办法]
楼主的问题其实每这么麻烦的,不过到成了练习英语的好地方了,呵呵
不能附值因为类型不匹配:无法从double[2]转化到double(*)[2].
至于aa和&aa的问题嘛,数组名和首地址的转化并不是任何情况都发生的.
虽然大多数情况是对的,因为这涉及c语言的数组名访问数组元素的实现机制,
aa[n]在运行时被解释为*(aa+n),所有情况都是这样的,正因为如此,才有所
谓的指针下标操作,如double *pf=aa;即可对pf进行下标操作.
但是注意两种情况(常用到的)一般不进行数组名的指针退化:一个就是这里的
取地址操作(&运算符),再就是编译期求大小操作(sizeof运算符) .
[解决办法]
多的不知道,但我可以告诉搂主,行与行之间差的不是10,以为那是16进制的10,其实就是16,所以行与行之间差的是16啊
[解决办法]
pf 是指针的指针,
如果将&aa的&去掉
pf的意义就发生变化了
就变成单重的指针了
那么*(*pf[i]+j)就发生错误了
单重的指针不能加两重的*号
[解决办法]
flizny == &flizny[0]; // name of array is the address of the first element.
Actually,this is also a matter about C.
Refer to <<C Primer Plus>>.--Fifth Edition,By Stephen Prata.
Chapter 10. Arrays and Pointers-Pointers and Multidimensional Arrays.
[解决办法]
我是来学英语的了.
其实我觉得象楼主的问题,有个方法很简单哈.你直接把pf[0],pf[],aa,&aa的值给他输出来,一切都清楚的很了.
[解决办法]
恩,楼上的建议非常好!
与其这样迷惑,还不如把指针以及指针指向的内容全部输出出来,那样一目了然,自然也很容易懂了!
输出一个指针可以用 (void*)pf 来实现