指针
指针这东西,要是搞复杂了,这还真是高深莫测,你不认真研读研读还真不行,真心觉得搞程序一浮躁,各种bug就都出来了。
指针的声明:
1 int x=20;
2 int *p,q;
3 int* m,n;
4 p=&x;
5 q=x;
6 m=&x;
7 n=x;
8 cout《*p《" "《q《" "《*m《" "《n;
我想,这应该就是最简单的声明了吧,p是一个指针,并且是一个指向x的指针。那么如果cout《p;会得到什么结构呢?其实p本身保存的是一个地址。并且保存的是x所存储的地址。
不信的话可以改成以下语句:
1 int x=20;
2 int *p,q;
3 int* m,n;
4 p=&x;
5 q=x;
6 m=&x;
7 n=x;
8 cout《p《" "《&x《" "《m;
他的输出结果就是:
所以,在这里我们已经对指针有一个初步的认识,指针其实就是一个地址的东西,只不过这个地址保存的是我们所指向的值得地址。
空指针void*
我们一般的指明了指向类型的指针都是只能指向该类型的,比如说上面提到的p指针,它只能指向Int类型。但是void*是怎么样的呢?
其实void*指针可以指向任何类型,当然也可以指向int.如果我们下面代码会出现什么情况呢?
1 void *y;
2 y=&x;
3 cout《y;
实际上我们会发现,y输出的是地址,并且和上面的P,m的地址是一致的,实验发现,我上面的说法是对的。
很显然,如果仅仅得到一个void*指针是没有太大意义的,那么我们怎么把他转化成原有的int*,甚至转化成int呢?
这里我们需要显示转化,(int*)y,转化成整数的话就是*((int*)y);
所以现在我们应该知道了当函数的返回值是void和void*是有多么大的不同了吧。void*是返回一个特殊的指针类型。
多重指针
这里说的多重指针在很多地方也称为指向指针的指针。
我们是不是经常会遇到int **m;这种情况呢,其实他就是一个多重指针。
还是上面那个例子,我们以下定义一个多重指针
1 int **z;
2 z=&p;
3 cout《"多重指针"《p《*z;
p我们知道会输出x的地址,那么*z又是上面呢,z是一个指向指针p的指针。那么z保存的是p的地址,*z理所当然的应该保存的也是x的地址。
了解了这个之后,那么我们就很容易的知道了,动态二维数组的创建过程了,就是一个指向指针的指针,二重指针嘛,so easy.