2013-10-15
感谢antou的投稿。
代码:
#include<iostream>
#include<conio.h>
using namespace std;
void main()
{
int a[20]={1,2,3};
int (*b)[20]=&a;
int *c=a;
cout<<a<<" "<<" "<<&a<<" "<<*&a<<endl;
cout<<a<<" "<<b<<" "<<*b<<endl;
cout<<*(*b+1)<<" "<<*(&a+1);
_getch();
}
为了理解上面的代码,我们先复习一下&
和*
符号的区别,&
指的是取地址,而*
指的是获取相应地址内存放的内容。对这个程序可以这样理解,这个程序实例中a其实相当于一个指向元素个数为20的int数组首地址的指针,而&a是该指针自身的地址,所以它相当于这里的b,相当于一个二维数组的指针,每一维有20个int元素。见如下框图:
另外,若定义int *b=a
,则虽然这的b和上面讲到的b所指地址相同,但它们的实质是不一样的。
但是,又不能完全这么理解,若在程序中加入如下的输出代码:
cout<<a<<" "<<" "<<&a<<" "<<*&a<<endl;
cout<<a<<" "<<b<<" "<<*b<<endl;
会发现输出b
和*b
输出的其实是一个东西,且都是数组a的首地址,那么按照上面的框图理解的话就会出现b所指的指针指向该指针自身的情况,这就说明在其中一定有更底层的东西尚待理解。因此,这样的框图只能用来理解*(*b+1)
和**(b+1)
两者的区别了。